arnaucube
arnaucube/poulpyPublic Self-hosted repository
Traits cleaning, CBT example & bug fixes (#72)

* Some cleaning, CBT example, fix mod switch and add LUT correctness test to BR test

* finished trait cleaning

* removed trait aliastoutside of backend
Jean-Philippe Bossuat jeanphilippe.bossuat@gmail.com
Sat, 16 Aug 2025 18:23:22 +0200
commit

3a828740ccbdc33993a427df911ed23bd39a7866

parent

c7219c35e9d7492cf046b006501560c2a3aebde4

99 files changed, 3267 insertions(+), 1220 deletions(-)

jump to
M Cargo.lock → Cargo.lock

@@ -43,14 +43,11 @@ "byteorder",

"cmake", "criterion", "itertools 0.14.0", - "paste", "rand", "rand_core", "rand_distr", "rug", "sampling", - "utils", - "zstd", ] [[package]]

@@ -83,8 +80,6 @@ version = "1.2.31"

source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" dependencies = [ - "jobserver", - "libc", "shlex", ]

@@ -240,12 +235,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] name = "getrandom" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index"

@@ -300,15 +289,6 @@ name = "itoa"

version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] [[package]] name = "js-sys"

@@ -367,18 +347,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] name = "plotters" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index"

@@ -407,6 +375,16 @@ "plotters-backend",

] [[package]] +name = "poulpy" +version = "0.1.0" +dependencies = [ + "backend", + "core", + "sampling", + "schemes", +] + +[[package]] name = "ppv-lite86" version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index"

@@ -640,13 +618,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] -name = "utils" -version = "0.1.0" -dependencies = [ - "fnv", -] - -[[package]] name = "walkdir" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index"

@@ -849,31 +820,3 @@ "proc-macro2",

"quote", "syn", ] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" -dependencies = [ - "cc", - "pkg-config", -]
M Cargo.toml → Cargo.toml

@@ -1,5 +1,5 @@

[workspace] -members = ["backend", "core", "sampling", "utils", "schemes"] +members = ["backend", "core", "sampling", "schemes", "poulpy"] resolver = "3" [workspace.dependencies]
M backend/Cargo.toml → backend/Cargo.toml

@@ -12,10 +12,7 @@ rand = {workspace = true}

rand_distr = {workspace = true} rand_core = {workspace = true} sampling = { path = "../sampling" } -utils = { path = "../utils" } -paste = "1.0.15" byteorder = {workspace = true} -zstd = {workspace = true} [build-dependencies] cmake = "0.1.54"
M backend/src/hal/api/vmp_pmat.rs → backend/src/hal/api/vmp_pmat.rs

@@ -26,7 +26,7 @@ pub trait VmpPrepareTmpBytes {

fn vmp_prepare_tmp_bytes(&self, n: usize, rows: usize, cols_in: usize, cols_out: usize, size: usize) -> usize; } -pub trait VmpPMatPrepare<B: Backend> { +pub trait VmpPrepare<B: Backend> { fn vmp_prepare<R, A>(&self, res: &mut R, a: &A, scratch: &mut Scratch<B>) where R: VmpPMatToMut<B>,
M backend/src/hal/delegates/vmp_pmat.rs → backend/src/hal/delegates/vmp_pmat.rs

@@ -1,7 +1,7 @@

use crate::hal::{ api::{ VmpApply, VmpApplyAdd, VmpApplyAddTmpBytes, VmpApplyTmpBytes, VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatFromBytes, - VmpPMatPrepare, VmpPrepareTmpBytes, + VmpPrepare, VmpPrepareTmpBytes, }, layouts::{Backend, MatZnxToRef, Module, Scratch, VecZnxDftToMut, VecZnxDftToRef, VmpPMatOwned, VmpPMatToMut, VmpPMatToRef}, oep::{

@@ -54,7 +54,7 @@ B::vmp_prepare_tmp_bytes_impl(self, n, rows, cols_in, cols_out, size)

} } -impl<B> VmpPMatPrepare<B> for Module<B> +impl<B> VmpPrepare<B> for Module<B> where B: Backend + VmpPMatPrepareImpl<B>, {
M core/src/automorphism/gglwe_atk.rs → core/src/automorphism/gglwe_atk.rs

@@ -1,12 +1,13 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnxDft, VecZnxAutomorphism, VecZnxAutomorphismInplace, ZnxZero}, + api::{ + ScratchAvailable, TakeVecZnxDft, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxBigAddSmallInplace, + VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, + VmpApply, VmpApplyAdd, VmpApplyTmpBytes, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, }; -use crate::{ - layouts::{GGLWEAutomorphismKey, GLWECiphertext, Infos, prepared::GGLWEAutomorphismKeyPrepared}, - trait_families::GLWEKeyswitchFamily, -}; +use crate::layouts::{GGLWEAutomorphismKey, GLWECiphertext, Infos, prepared::GGLWEAutomorphismKeyPrepared}; impl GGLWEAutomorphismKey<Vec<u8>> { pub fn automorphism_scratch_space<B: Backend>(

@@ -20,7 +21,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GLWECiphertext::keyswitch_scratch_space(module, n, basek, k_out, k_in, k_ksk, digits, rank, rank) }

@@ -35,7 +36,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GGLWEAutomorphismKey::automorphism_scratch_space(module, n, basek, k_out, k_out, k_ksk, digits, rank) }

@@ -49,8 +50,18 @@ lhs: &GGLWEAutomorphismKey<DataLhs>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxAutomorphism + VecZnxAutomorphismInplace, - Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphism + + VecZnxAutomorphismInplace, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B>, { #[cfg(debug_assertions)] {

@@ -123,8 +134,18 @@ module: &Module<B>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxAutomorphism + VecZnxAutomorphismInplace, - Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphism + + VecZnxAutomorphismInplace, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B>, { unsafe { let self_ptr: *mut GGLWEAutomorphismKey<DataSelf> = self as *mut GGLWEAutomorphismKey<DataSelf>;
M core/src/automorphism/ggsw_ct.rs → core/src/automorphism/ggsw_ct.rs

@@ -1,14 +1,16 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnxBig, TakeVecZnxDft, VecZnxAutomorphismInplace, VecZnxNormalizeTmpBytes}, + api::{ + ScratchAvailable, TakeVecZnxBig, TakeVecZnxDft, VecZnxAutomorphismInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, + VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAddInplace, VecZnxDftAllocBytes, VecZnxDftCopy, + VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, VecZnxNormalizeTmpBytes, VmpApply, + VmpApplyAdd, VmpApplyTmpBytes, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, }; -use crate::{ - layouts::{ - GGSWCiphertext, GLWECiphertext, Infos, - prepared::{GGLWEAutomorphismKeyPrepared, GGLWETensorKeyPrepared}, - }, - trait_families::{GGSWKeySwitchFamily, GLWEKeyswitchFamily}, +use crate::layouts::{ + GGSWCiphertext, GLWECiphertext, Infos, + prepared::{GGLWEAutomorphismKeyPrepared, GGLWETensorKeyPrepared}, }; impl GGSWCiphertext<Vec<u8>> {

@@ -25,7 +27,8 @@ digits_tsk: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, + Module<B>: + VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigAllocBytes + VecZnxNormalizeTmpBytes + VecZnxBigNormalizeTmpBytes, { let out_size: usize = k_out.div_ceil(basek); let ci_dft: usize = module.vec_znx_dft_alloc_bytes(n, rank + 1, out_size);

@@ -47,7 +50,8 @@ digits_tsk: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, + Module<B>: + VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigAllocBytes + VecZnxNormalizeTmpBytes + VecZnxBigNormalizeTmpBytes, { GGSWCiphertext::automorphism_scratch_space( module, n, basek, k_out, k_out, k_ksk, digits_ksk, k_tsk, digits_tsk, rank,

@@ -64,8 +68,22 @@ auto_key: &GGLWEAutomorphismKeyPrepared<DataAk, B>,

tensor_key: &GGLWETensorKeyPrepared<DataTsk, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxAutomorphismInplace + VecZnxNormalizeTmpBytes, - Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace + + VecZnxBigAllocBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftCopy<B> + + VecZnxDftAddInplace<B> + + VecZnxDftToVecZnxBigTmpA<B>, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnxBig<B>, { #[cfg(debug_assertions)] {

@@ -121,8 +139,22 @@ auto_key: &GGLWEAutomorphismKeyPrepared<DataKsk, B>,

tensor_key: &GGLWETensorKeyPrepared<DataTsk, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxAutomorphismInplace + VecZnxNormalizeTmpBytes, - Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace + + VecZnxBigAllocBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftCopy<B> + + VecZnxDftAddInplace<B> + + VecZnxDftToVecZnxBigTmpA<B>, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnxBig<B>, { unsafe { let self_ptr: *mut GGSWCiphertext<DataSelf> = self as *mut GGSWCiphertext<DataSelf>;

@@ -137,8 +169,17 @@ lhs: &GGSWCiphertext<DataLhs>,

auto_key: &GGLWEAutomorphismKeyPrepared<DataAk, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxAutomorphismInplace + VecZnxNormalizeTmpBytes, - Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { // Keyswitch the j-th row of the col 0 (0..lhs.rows()).for_each(|row_i| {
M core/src/automorphism/glwe_ct.rs → core/src/automorphism/glwe_ct.rs

@@ -1,15 +1,13 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeVecZnxDft, VecZnxAutomorphismInplace, VecZnxBigAutomorphismInplace, VecZnxBigSubSmallAInplace, - VecZnxBigSubSmallBInplace, + ScratchAvailable, TakeVecZnxDft, VecZnxAutomorphismInplace, VecZnxBigAddSmallInplace, VecZnxBigAutomorphismInplace, + VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxBigSubSmallAInplace, VecZnxBigSubSmallBInplace, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, }, layouts::{Backend, DataMut, DataRef, Module, Scratch, VecZnxBig}, }; -use crate::{ - layouts::{GLWECiphertext, Infos, prepared::GGLWEAutomorphismKeyPrepared}, - trait_families::GLWEKeyswitchFamily, -}; +use crate::layouts::{GLWECiphertext, Infos, prepared::GGLWEAutomorphismKeyPrepared}; impl GLWECiphertext<Vec<u8>> { pub fn automorphism_scratch_space<B: Backend>(

@@ -23,7 +21,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { Self::keyswitch_scratch_space(module, n, basek, k_out, k_in, k_ksk, digits, rank, rank) }

@@ -38,7 +36,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { Self::keyswitch_inplace_scratch_space(module, n, basek, k_out, k_ksk, digits, rank) }

@@ -52,7 +50,16 @@ lhs: &GLWECiphertext<DataLhs>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxAutomorphismInplace, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { self.keyswitch(module, lhs, &rhs.key, scratch);

@@ -67,7 +74,16 @@ module: &Module<B>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxAutomorphismInplace, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { self.keyswitch_inplace(module, &rhs.key, scratch);

@@ -83,7 +99,16 @@ lhs: &GLWECiphertext<DataLhs>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxBigAutomorphismInplace<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxBigAutomorphismInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { #[cfg(debug_assertions)]

@@ -105,7 +130,16 @@ module: &Module<B>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxBigAutomorphismInplace<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxBigAutomorphismInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { unsafe {

@@ -121,7 +155,17 @@ lhs: &GLWECiphertext<DataLhs>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxBigAutomorphismInplace<B> + VecZnxBigSubSmallAInplace<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxBigAutomorphismInplace<B> + + VecZnxBigSubSmallAInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { #[cfg(debug_assertions)]

@@ -143,7 +187,17 @@ module: &Module<B>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxBigAutomorphismInplace<B> + VecZnxBigSubSmallAInplace<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxBigAutomorphismInplace<B> + + VecZnxBigSubSmallAInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { unsafe {

@@ -159,7 +213,17 @@ lhs: &GLWECiphertext<DataLhs>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxBigAutomorphismInplace<B> + VecZnxBigSubSmallBInplace<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxBigAutomorphismInplace<B> + + VecZnxBigSubSmallBInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { #[cfg(debug_assertions)]

@@ -181,7 +245,17 @@ module: &Module<B>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + VecZnxBigAutomorphismInplace<B> + VecZnxBigSubSmallBInplace<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxBigAutomorphismInplace<B> + + VecZnxBigSubSmallBInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { unsafe {
M core/src/conversion/glwe_to_lwe.rs → core/src/conversion/glwe_to_lwe.rs

@@ -1,5 +1,9 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnx, TakeVecZnxDft, ZnxView, ZnxViewMut, ZnxZero}, + api::{ + ScratchAvailable, TakeVecZnxDft, VecZnxBigAddSmallInplace, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, ZnxView, + ZnxViewMut, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -7,8 +11,6 @@ use crate::{

TakeGLWECt, layouts::{GLWECiphertext, Infos, LWECiphertext, prepared::GLWEToLWESwitchingKeyPrepared}, }; - -use crate::trait_families::GLWEKeyswitchFamily; impl LWECiphertext<Vec<u8>> { pub fn from_glwe_scratch_space<B: Backend>(

@@ -21,7 +23,7 @@ k_ksk: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GLWECiphertext::bytes_of(n, basek, k_lwe, 1) + GLWECiphertext::keyswitch_scratch_space(module, n, basek, k_lwe, k_glwe, k_ksk, 1, rank, 1)

@@ -55,8 +57,16 @@ scratch: &mut Scratch<B>,

) where DGlwe: DataRef, DKs: DataRef, - Module<B>: GLWEKeyswitchFamily<B>, - Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeGLWECt, { #[cfg(debug_assertions)] {
M core/src/conversion/lwe_to_glwe.rs → core/src/conversion/lwe_to_glwe.rs

@@ -1,5 +1,9 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnx, TakeVecZnxDft, ZnxView, ZnxViewMut, ZnxZero}, + api::{ + ScratchAvailable, TakeVecZnxDft, VecZnxBigAddSmallInplace, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, ZnxView, + ZnxViewMut, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -8,8 +12,6 @@ TakeGLWECt,

layouts::{GLWECiphertext, Infos, LWECiphertext, prepared::LWEToGLWESwitchingKeyPrepared}, }; -use crate::trait_families::GLWEKeyswitchFamily; - impl GLWECiphertext<Vec<u8>> { pub fn from_lwe_scratch_space<B: Backend>( module: &Module<B>,

@@ -21,7 +23,7 @@ k_ksk: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GLWECiphertext::keyswitch_scratch_space(module, n, basek, k_glwe, k_lwe, k_ksk, 1, 1, rank) + GLWECiphertext::bytes_of(n, basek, k_lwe, 1)

@@ -38,8 +40,16 @@ scratch: &mut Scratch<B>,

) where DLwe: DataRef, DKsk: DataRef, - Module<B>: GLWEKeyswitchFamily<B>, - Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeGLWECt, { #[cfg(debug_assertions)] {
M core/src/decryption/glwe_ct.rs → core/src/decryption/glwe_ct.rs

@@ -6,15 +6,12 @@ },

layouts::{Backend, DataMut, DataRef, Module, Scratch}, }; -use crate::{ - layouts::{GLWECiphertext, GLWEPlaintext, Infos, prepared::GLWESecretPrepared}, - trait_families::GLWEDecryptFamily, -}; +use crate::layouts::{GLWECiphertext, GLWEPlaintext, Infos, prepared::GLWESecretPrepared}; impl GLWECiphertext<Vec<u8>> { pub fn decrypt_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize where - Module<B>: GLWEDecryptFamily<B>, + Module<B>: VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes, { let size: usize = k.div_ceil(basek); (module.vec_znx_normalize_tmp_bytes(n) | module.vec_znx_dft_alloc_bytes(n, 1, size))

@@ -30,7 +27,12 @@ pt: &mut GLWEPlaintext<DataPt>,

sk: &GLWESecretPrepared<DataSk, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEDecryptFamily<B>, + Module<B>: VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + TakeVecZnxBig<B>, { #[cfg(debug_assertions)]
M core/src/encryption/compressed/gglwe_atk.rs → core/src/encryption/compressed/gglwe_atk.rs

@@ -1,7 +1,9 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxAutomorphism, - VecZnxSwithcDegree, + ScratchAvailable, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxBigNormalize, VecZnxDftAllocBytes, + VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, + VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -10,17 +12,15 @@

use crate::{ TakeGLWESecret, TakeGLWESecretPrepared, layouts::{ - GLWESecret, Infos, + GLWESecret, compressed::{GGLWEAutomorphismKeyCompressed, GGLWESwitchingKeyCompressed}, }, }; - -use crate::trait_families::{GGLWEAutomorphismKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; impl GGLWEAutomorphismKeyCompressed<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank: usize) -> usize where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes + SvpPPolAllocBytes, { GGLWESwitchingKeyCompressed::encrypt_sk_scratch_space(module, n, basek, k, rank, rank) + GLWESecret::bytes_of(n, rank) }

@@ -37,15 +37,30 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> + Module<B>: VecZnxAutomorphism + + SvpPrepare<B> + + SvpPPolAllocBytes + VecZnxSwithcDegree - + VecZnxAutomorphism - + VecZnxAddScalarInplace - + GLWESecretPreparedModuleFamily<B>, - Scratch<B>: ScratchAvailable + TakeScalarZnx + TakeVecZnxDft<B> + TakeGLWESecretPrepared<B> + TakeVecZnx, + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + VecZnxAddScalarInplace, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeGLWESecretPrepared<B>, { #[cfg(debug_assertions)] { + use crate::layouts::Infos; + assert_eq!(self.n(), sk.n()); assert_eq!(self.rank_out(), self.rank_in()); assert_eq!(sk.rank(), self.rank());
M core/src/encryption/compressed/gglwe_ct.rs → core/src/encryption/compressed/gglwe_ct.rs

@@ -1,5 +1,9 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxNormalizeInplace, ZnxZero}, + api::{ + ScratchAvailable, SvpApplyInplace, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, ScalarZnx, Scratch}, }; use sampling::source::Source;

@@ -10,12 +14,10 @@ encryption::glwe_encrypt_sk_internal,

layouts::{GGLWECiphertext, Infos, compressed::GGLWECiphertextCompressed, prepared::GLWESecretPrepared}, }; -use crate::trait_families::{GGLWEEncryptSkFamily, GGLWESwitchingKeyEncryptSkFamily}; - impl GGLWECiphertextCompressed<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize where - Module<B>: GGLWESwitchingKeyEncryptSkFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes, { GGLWECiphertext::encrypt_sk_scratch_space(module, n, basek, k) }

@@ -32,7 +34,20 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GGLWEEncryptSkFamily<B> + VecZnxAddScalarInplace, + Module<B>: VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]
M core/src/encryption/compressed/gglwe_ksk.rs → core/src/encryption/compressed/gglwe_ksk.rs

@@ -1,18 +1,18 @@

use backend::hal::{ - api::{ScratchAvailable, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxSwithcDegree}, + api::{ + ScratchAvailable, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, + VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, + }, layouts::{Backend, DataMut, DataRef, Module, ScalarZnx, Scratch}, }; use sampling::source::Source; use crate::{ TakeGLWESecretPrepared, - layouts::{ - GGLWECiphertext, GGLWESwitchingKey, GLWESecret, Infos, compressed::GGLWESwitchingKeyCompressed, - prepared::GLWESecretPrepared, - }, + layouts::{GGLWECiphertext, GLWESecret, compressed::GGLWESwitchingKeyCompressed, prepared::GLWESecretPrepared}, }; - -use crate::trait_families::{GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; impl GGLWESwitchingKeyCompressed<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(

@@ -24,7 +24,7 @@ rank_in: usize,

rank_out: usize, ) -> usize where - Module<B>: GGLWESwitchingKeyEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes + SvpPPolAllocBytes, { (GGLWECiphertext::encrypt_sk_scratch_space(module, n, basek, k) | ScalarZnx::alloc_bytes(n, 1)) + ScalarZnx::alloc_bytes(n, rank_in)

@@ -43,13 +43,29 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: - GGLWESwitchingKeyEncryptSkFamily<B> + VecZnxSwithcDegree + VecZnxAddScalarInplace + GLWESecretPreparedModuleFamily<B>, - Scratch<B>: - ScratchAvailable + TakeScalarZnx + TakeVecZnxDft<B> + TakeGLWESecretPrepared<B> + ScratchAvailable + TakeVecZnx, + Module<B>: SvpPrepare<B> + + SvpPPolAllocBytes + + VecZnxSwithcDegree + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + VecZnxAddScalarInplace, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeGLWESecretPrepared<B>, { #[cfg(debug_assertions)] { + use crate::layouts::{GGLWESwitchingKey, Infos}; + assert!(sk_in.n() <= module.n()); assert!(sk_out.n() <= module.n()); assert!(
M core/src/encryption/compressed/gglwe_tsk.rs → core/src/encryption/compressed/gglwe_tsk.rs

@@ -1,7 +1,10 @@

use backend::hal::{ api::{ - ScratchAvailable, SvpApply, TakeScalarZnx, TakeVecZnx, TakeVecZnxBig, TakeVecZnxDft, VecZnxAddScalarInplace, - VecZnxDftToVecZnxBigTmpA, VecZnxSwithcDegree, + ScratchAvailable, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, + TakeVecZnxBig, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAllocBytes, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, + VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + VecZnxSwithcDegree, }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -10,15 +13,13 @@

use crate::{ TakeGLWESecret, TakeGLWESecretPrepared, layouts::{GGLWETensorKey, GLWESecret, Infos, compressed::GGLWETensorKeyCompressed, prepared::Prepare}, - trait_families::GLWEDecryptFamily, }; -use crate::trait_families::{GGLWETensorKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - impl GGLWETensorKeyCompressed<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank: usize) -> usize where - Module<B>: GGLWETensorKeyEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: + SvpPPolAllocBytes + VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes + VecZnxBigAllocBytes, { GGLWETensorKey::encrypt_sk_scratch_space(module, n, basek, k, rank) }

@@ -34,10 +35,33 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: - GGLWETensorKeyEncryptSkFamily<B> + VecZnxSwithcDegree + VecZnxAddScalarInplace + GLWESecretPreparedModuleFamily<B>, - Scratch<B>: - ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B> + TakeGLWESecretPrepared<B> + TakeScalarZnx + TakeVecZnx, + Module<B>: SvpApply<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + VecZnxSwithcDegree + + VecZnxAddScalarInplace + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B>, + Scratch<B>: ScratchAvailable + + TakeScalarZnx + + TakeVecZnxDft<B> + + TakeGLWESecretPrepared<B> + + ScratchAvailable + + TakeVecZnx + + TakeVecZnxBig<B>, { #[cfg(debug_assertions)] {
M core/src/encryption/compressed/ggsw_ct.rs → core/src/encryption/compressed/ggsw_ct.rs

@@ -1,5 +1,9 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxNormalizeInplace, ZnxZero}, + api::{ + ScratchAvailable, SvpApplyInplace, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, ScalarZnx, Scratch}, }; use sampling::source::Source;

@@ -10,12 +14,10 @@ encryption::glwe_encrypt_sk_internal,

layouts::{GGSWCiphertext, Infos, compressed::GGSWCiphertextCompressed, prepared::GLWESecretPrepared}, }; -use crate::trait_families::GGSWEncryptSkFamily; - impl GGSWCiphertextCompressed<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank: usize) -> usize where - Module<B>: GGSWEncryptSkFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes, { GGSWCiphertext::encrypt_sk_scratch_space(module, n, basek, k, rank) }

@@ -32,7 +34,20 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GGSWEncryptSkFamily<B> + VecZnxAddScalarInplace, + Module<B>: VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]
M core/src/encryption/compressed/glwe_ct.rs → core/src/encryption/compressed/glwe_ct.rs

@@ -1,5 +1,9 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnx, TakeVecZnxDft}, + api::{ + ScratchAvailable, SvpApplyInplace, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxBigNormalize, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, }; use sampling::source::Source;

@@ -9,12 +13,10 @@ encryption::glwe_ct::glwe_encrypt_sk_internal,

layouts::{GLWECiphertext, GLWEPlaintext, Infos, compressed::GLWECiphertextCompressed, prepared::GLWESecretPrepared}, }; -use crate::trait_families::GLWEEncryptSkFamily; - impl GLWECiphertextCompressed<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes, { GLWECiphertext::encrypt_sk_scratch_space(module, n, basek, k) }

@@ -31,7 +33,19 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { self.encrypt_sk_internal(

@@ -55,7 +69,19 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { let mut source_xa = Source::new(seed_xa);
M core/src/encryption/gglwe_atk.rs → core/src/encryption/gglwe_atk.rs

@@ -1,7 +1,9 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxAutomorphism, - VecZnxSwithcDegree, + ScratchAvailable, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxBigNormalize, VecZnxDftAllocBytes, + VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, + VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -9,15 +11,13 @@ use sampling::source::Source;

use crate::{ TakeGLWESecret, TakeGLWESecretPrepared, - layouts::{GGLWEAutomorphismKey, GGLWESwitchingKey, GLWESecret, Infos}, + layouts::{GGLWEAutomorphismKey, GGLWESwitchingKey, GLWESecret}, }; - -use crate::trait_families::{GGLWEAutomorphismKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; impl GGLWEAutomorphismKey<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank: usize) -> usize where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: SvpPPolAllocBytes + VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes, { GGLWESwitchingKey::encrypt_sk_scratch_space(module, n, basek, k, rank, rank) + GLWESecret::bytes_of(n, rank) }

@@ -38,15 +38,30 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> - + VecZnxAutomorphism + Module<B>: VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + VecZnxSwithcDegree - + VecZnxAddScalarInplace - + GLWESecretPreparedModuleFamily<B>, - Scratch<B>: ScratchAvailable + TakeScalarZnx + TakeVecZnxDft<B> + TakeGLWESecretPrepared<B> + TakeVecZnx, + + SvpPPolAllocBytes + + VecZnxAutomorphism, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeGLWESecretPrepared<B>, { #[cfg(debug_assertions)] { + use crate::layouts::Infos; + assert_eq!(self.n(), sk.n()); assert_eq!(self.rank_out(), self.rank_in()); assert_eq!(sk.rank(), self.rank());
M core/src/encryption/gglwe_ct.rs → core/src/encryption/gglwe_ct.rs

@@ -1,7 +1,8 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, - ZnxZero, + ScratchAvailable, SvpApplyInplace, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, ZnxZero, }, layouts::{Backend, DataMut, DataRef, Module, ScalarZnx, Scratch}, };

@@ -12,12 +13,10 @@ TakeGLWEPt,

layouts::{GGLWECiphertext, GLWECiphertext, GLWEPlaintext, Infos, prepared::GLWESecretPrepared}, }; -use crate::trait_families::GGLWEEncryptSkFamily; - impl GGLWECiphertext<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize where - Module<B>: GGLWEEncryptSkFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes, { GLWECiphertext::encrypt_sk_scratch_space(module, n, basek, k) + (GLWEPlaintext::byte_of(n, basek, k) | module.vec_znx_normalize_tmp_bytes(n))

@@ -39,7 +38,20 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GGLWEEncryptSkFamily<B> + VecZnxAddScalarInplace, + Module<B>: VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]
M core/src/encryption/gglwe_ksk.rs → core/src/encryption/gglwe_ksk.rs

@@ -1,16 +1,19 @@

use backend::hal::{ - api::{ScratchAvailable, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxSwithcDegree}, + api::{ + ScratchAvailable, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, + VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, + }, layouts::{Backend, DataMut, DataRef, Module, ScalarZnx, Scratch}, }; use sampling::source::Source; use crate::{ TakeGLWESecretPrepared, - layouts::{GGLWECiphertext, GGLWESwitchingKey, GLWESecret, Infos, prepared::GLWESecretPrepared}, + layouts::{GGLWECiphertext, GGLWESwitchingKey, GLWESecret, prepared::GLWESecretPrepared}, }; -use crate::trait_families::{GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - impl GGLWESwitchingKey<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>( module: &Module<B>,

@@ -21,7 +24,7 @@ rank_in: usize,

rank_out: usize, ) -> usize where - Module<B>: GGLWESwitchingKeyEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: SvpPPolAllocBytes + VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes, { (GGLWECiphertext::encrypt_sk_scratch_space(module, n, basek, k) | ScalarZnx::alloc_bytes(n, 1)) + ScalarZnx::alloc_bytes(n, rank_in)

@@ -51,13 +54,29 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: - GGLWESwitchingKeyEncryptSkFamily<B> + VecZnxSwithcDegree + VecZnxAddScalarInplace + GLWESecretPreparedModuleFamily<B>, - Scratch<B>: - ScratchAvailable + TakeScalarZnx + TakeVecZnxDft<B> + TakeGLWESecretPrepared<B> + ScratchAvailable + TakeVecZnx, + Module<B>: VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + VecZnxSwithcDegree + + SvpPPolAllocBytes, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeGLWESecretPrepared<B>, { #[cfg(debug_assertions)] { + use crate::layouts::Infos; + assert!(sk_in.n() <= module.n()); assert!(sk_out.n() <= module.n()); assert!(
M core/src/encryption/gglwe_tsk.rs → core/src/encryption/gglwe_tsk.rs

@@ -1,7 +1,9 @@

use backend::hal::{ api::{ - ScratchAvailable, SvpApply, TakeScalarZnx, TakeVecZnx, TakeVecZnxBig, TakeVecZnxDft, VecZnxAddScalarInplace, - VecZnxBigAllocBytes, VecZnxDftToVecZnxBigTmpA, VecZnxSwithcDegree, + ScratchAvailable, SvpApply, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, TakeVecZnxBig, + TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAllocBytes, VecZnxBigNormalize, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -13,15 +15,13 @@ layouts::{

GGLWESwitchingKey, GGLWETensorKey, GLWESecret, Infos, prepared::{GLWESecretPrepared, Prepare}, }, - trait_families::GLWEDecryptFamily, }; - -use crate::trait_families::{GGLWETensorKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; impl GGLWETensorKey<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank: usize) -> usize where - Module<B>: GGLWETensorKeyEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: + SvpPPolAllocBytes + VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes + VecZnxBigAllocBytes, { GLWESecretPrepared::bytes_of(module, n, rank) + module.vec_znx_dft_alloc_bytes(n, rank, 1)

@@ -42,10 +42,27 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: - GGLWETensorKeyEncryptSkFamily<B> + VecZnxSwithcDegree + VecZnxAddScalarInplace + GLWESecretPreparedModuleFamily<B>, + Module<B>: SvpApply<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + VecZnxSwithcDegree + + SvpPPolAllocBytes, Scratch<B>: - ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B> + TakeGLWESecretPrepared<B> + TakeScalarZnx + TakeVecZnx, + TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeGLWESecretPrepared<B> + TakeVecZnxBig<B>, { #[cfg(debug_assertions)] {
M core/src/encryption/ggsw_ct.rs → core/src/encryption/ggsw_ct.rs

@@ -1,5 +1,9 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxNormalizeInplace, ZnxZero}, + api::{ + ScratchAvailable, SvpApplyInplace, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, ScalarZnx, Scratch, VecZnx}, }; use sampling::source::Source;

@@ -9,14 +13,10 @@ TakeGLWEPt,

layouts::{GGSWCiphertext, GLWECiphertext, Infos, prepared::GLWESecretPrepared}, }; -use crate::trait_families::GLWEEncryptSkFamily; - -pub trait GGSWEncryptSkFamily<B: Backend> = GLWEEncryptSkFamily<B>; - impl GGSWCiphertext<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank: usize) -> usize where - Module<B>: GGSWEncryptSkFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes, { let size = k.div_ceil(basek); GLWECiphertext::encrypt_sk_scratch_space(module, n, basek, k)

@@ -37,7 +37,20 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GGSWEncryptSkFamily<B> + VecZnxAddScalarInplace, + Module<B>: VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]
M core/src/encryption/glwe_ct.rs → core/src/encryption/glwe_ct.rs

@@ -1,8 +1,9 @@

use backend::hal::{ api::{ - ScratchAvailable, SvpApply, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeSvpPPol, TakeVecZnx, TakeVecZnxDft, - VecZnxBigAddNormal, VecZnxBigAddSmallInplace, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftToVecZnxBigConsume, - ZnxInfos, ZnxZero, + ScratchAvailable, SvpApply, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeSvpPPol, TakeVecZnx, + TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxBigAddNormal, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, ZnxInfos, ZnxZero, }, layouts::{Backend, DataMut, DataRef, Module, ScalarZnx, Scratch, VecZnx, VecZnxBig}, };

@@ -15,20 +16,19 @@ layouts::{

GLWECiphertext, GLWEPlaintext, Infos, prepared::{GLWEPublicKeyPrepared, GLWESecretPrepared}, }, - trait_families::{GLWEEncryptPkFamily, GLWEEncryptSkFamily}, }; impl GLWECiphertext<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes, { let size: usize = k.div_ceil(basek); module.vec_znx_normalize_tmp_bytes(n) + 2 * VecZnx::alloc_bytes(n, 1, size) + module.vec_znx_dft_alloc_bytes(n, 1, size) } pub fn encrypt_pk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize where - Module<B>: GLWEEncryptPkFamily<B>, + Module<B>: VecZnxDftAllocBytes + SvpPPolAllocBytes + VecZnxBigAllocBytes + VecZnxNormalizeTmpBytes, { let size: usize = k.div_ceil(basek); ((module.vec_znx_dft_alloc_bytes(n, 1, size) + module.vec_znx_big_alloc_bytes(n, 1, size)) | ScalarZnx::alloc_bytes(n, 1))

@@ -48,7 +48,19 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]

@@ -84,7 +96,19 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]

@@ -119,7 +143,19 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { let cols: usize = self.rank() + 1;

@@ -149,8 +185,13 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEEncryptPkFamily<B>, - Scratch<B>: TakeVecZnxDft<B> + TakeSvpPPol<B> + TakeScalarZnx, + Module<B>: SvpPrepare<B> + + SvpApply<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddNormal<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: TakeSvpPPol<B> + TakeScalarZnx + TakeVecZnxDft<B>, { self.encrypt_pk_internal::<DataPt, DataPk, B>( module,

@@ -172,8 +213,13 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEEncryptPkFamily<B>, - Scratch<B>: TakeVecZnxDft<B> + TakeSvpPPol<B> + TakeScalarZnx, + Module<B>: SvpPrepare<B> + + SvpApply<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddNormal<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: TakeSvpPPol<B> + TakeScalarZnx + TakeVecZnxDft<B>, { self.encrypt_pk_internal::<Vec<u8>, DataPk, B>( module,

@@ -196,15 +242,13 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: VecZnxDftAllocBytes - + SvpPPolAllocBytes - + SvpPrepare<B> + Module<B>: SvpPrepare<B> + SvpApply<B> + VecZnxDftToVecZnxBigConsume<B> + VecZnxBigAddNormal<B> + VecZnxBigAddSmallInplace<B> + VecZnxBigNormalize<B>, - Scratch<B>: TakeVecZnxDft<B> + TakeSvpPPol<B> + TakeScalarZnx, + Scratch<B>: TakeSvpPPol<B> + TakeScalarZnx + TakeVecZnxDft<B>, { #[cfg(debug_assertions)] {

@@ -289,7 +333,19 @@ source_xe: &mut Source,

sigma: f64, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]
M core/src/encryption/glwe_pk.rs → core/src/encryption/glwe_pk.rs

@@ -1,16 +1,15 @@

use backend::hal::{ - api::{ScratchOwnedAlloc, ScratchOwnedBorrow}, + api::{ + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, VecZnxAddInplace, VecZnxAddNormal, VecZnxBigNormalize, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + }, layouts::{Backend, DataMut, DataRef, Module, ScratchOwned}, oep::{ScratchAvailableImpl, ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeVecZnxDftImpl, TakeVecZnxImpl}, }; use sampling::source::Source; -use crate::{ - dist::Distribution, - layouts::{GLWECiphertext, GLWEPublicKey, Infos, prepared::GLWESecretPrepared}, -}; - -use crate::trait_families::GLWEEncryptSkFamily; +use crate::layouts::{GLWECiphertext, GLWEPublicKey, Infos, prepared::GLWESecretPrepared}; impl<D: DataMut> GLWEPublicKey<D> { pub fn generate_from_sk<S: DataRef, B: Backend>(

@@ -21,7 +20,20 @@ source_xa: &mut Source,

source_xe: &mut Source, sigma: f64, ) where - Module<B>: GLWEEncryptSkFamily<B>, + Module<B>:, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + TakeVecZnxDftImpl<B>

@@ -30,6 +42,8 @@ + TakeVecZnxImpl<B>,

{ #[cfg(debug_assertions)] { + use crate::Distribution; + assert_eq!(self.n(), sk.n()); match sk.dist {
M core/src/encryption/glwe_to_lwe_ksk.rs → core/src/encryption/glwe_to_lwe_ksk.rs

@@ -1,7 +1,10 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, - VecZnxSwithcDegree, ZnxView, ZnxViewMut, ZnxZero, + ScratchAvailable, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, VecZnxBigNormalize, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, ZnxView, ZnxViewMut, + ZnxZero, }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -11,13 +14,11 @@ use crate::{

TakeGLWESecret, TakeGLWESecretPrepared, layouts::{GGLWESwitchingKey, GLWESecret, GLWEToLWESwitchingKey, LWESecret, prepared::GLWESecretPrepared}, }; - -use crate::trait_families::{GGLWEEncryptSkFamily, GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; impl GLWEToLWESwitchingKey<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank_in: usize) -> usize where - Module<B>: GGLWEEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: SvpPPolAllocBytes + VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes, { GLWESecretPrepared::bytes_of(module, n, rank_in) + (GGLWESwitchingKey::encrypt_sk_scratch_space(module, n, basek, k, rank_in, 1) | GLWESecret::bytes_of(n, rank_in))

@@ -37,12 +38,25 @@ scratch: &mut Scratch<B>,

) where DLwe: DataRef, DGlwe: DataRef, - Module<B>: GGLWESwitchingKeyEncryptSkFamily<B> - + VecZnxAutomorphismInplace - + VecZnxSwithcDegree + Module<B>: VecZnxAutomorphismInplace + VecZnxAddScalarInplace - + GLWESecretPreparedModuleFamily<B>, - Scratch<B>: ScratchAvailable + TakeScalarZnx + TakeVecZnxDft<B> + TakeGLWESecretPrepared<B> + TakeVecZnx, + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + VecZnxSwithcDegree + + SvpPPolAllocBytes, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeGLWESecretPrepared<B>, { #[cfg(debug_assertions)] {
M core/src/encryption/lwe_ksk.rs → core/src/encryption/lwe_ksk.rs

@@ -1,7 +1,9 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, - VecZnxSwithcDegree, ZnxView, ZnxViewMut, + ScratchAvailable, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, VecZnxBigNormalize, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, ZnxView, ZnxViewMut, }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -12,12 +14,10 @@ TakeGLWESecret, TakeGLWESecretPrepared,

layouts::{GGLWESwitchingKey, GLWESecret, Infos, LWESecret, LWESwitchingKey, prepared::GLWESecretPrepared}, }; -use crate::trait_families::{GGLWEEncryptSkFamily, GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - impl LWESwitchingKey<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize where - Module<B>: GGLWEEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: SvpPPolAllocBytes + VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes, { GLWESecret::bytes_of(n, 1) + GLWESecretPrepared::bytes_of(module, n, 1)

@@ -38,12 +38,25 @@ scratch: &mut Scratch<B>,

) where DIn: DataRef, DOut: DataRef, - Module<B>: GGLWESwitchingKeyEncryptSkFamily<B> - + VecZnxAutomorphismInplace + Module<B>: VecZnxAutomorphismInplace + + VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + VecZnxSwithcDegree - + VecZnxAddScalarInplace - + GLWESecretPreparedModuleFamily<B>, - Scratch<B>: ScratchAvailable + TakeScalarZnx + TakeVecZnxDft<B> + TakeGLWESecretPrepared<B> + TakeVecZnx, + + SvpPPolAllocBytes, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeGLWESecretPrepared<B>, { #[cfg(debug_assertions)] {
M core/src/encryption/lwe_to_glwe_ksk.rs → core/src/encryption/lwe_to_glwe_ksk.rs

@@ -1,7 +1,9 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, - VecZnxSwithcDegree, ZnxView, ZnxViewMut, + ScratchAvailable, SvpApplyInplace, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeVecZnx, TakeVecZnxDft, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, VecZnxBigNormalize, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, ZnxView, ZnxViewMut, }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -12,12 +14,10 @@ TakeGLWESecret, TakeGLWESecretPrepared,

layouts::{GGLWESwitchingKey, GLWESecret, LWESecret, LWEToGLWESwitchingKey}, }; -use crate::trait_families::{GGLWEEncryptSkFamily, GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - impl LWEToGLWESwitchingKey<Vec<u8>> { pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank_out: usize) -> usize where - Module<B>: GGLWEEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: SvpPPolAllocBytes + VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes + VecZnxNormalizeTmpBytes, { GGLWESwitchingKey::encrypt_sk_scratch_space(module, n, basek, k, 1, rank_out) + GLWESecret::bytes_of(n, 1) }

@@ -36,12 +36,25 @@ scratch: &mut Scratch<B>,

) where DLwe: DataRef, DGlwe: DataRef, - Module<B>: GGLWESwitchingKeyEncryptSkFamily<B> - + VecZnxAutomorphismInplace + Module<B>: VecZnxAutomorphismInplace + + VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + VecZnxSwithcDegree - + VecZnxAddScalarInplace - + GLWESecretPreparedModuleFamily<B>, - Scratch<B>: ScratchAvailable + TakeScalarZnx + TakeVecZnxDft<B> + TakeGLWESecretPrepared<B> + TakeVecZnx, + + SvpPPolAllocBytes, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeGLWESecretPrepared<B>, { #[cfg(debug_assertions)] {
M core/src/external_product/gglwe_atk.rs → core/src/external_product/gglwe_atk.rs

@@ -1,12 +1,12 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnxDft}, + api::{ + ScratchAvailable, TakeVecZnxDft, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxNormalizeTmpBytes, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, }; -use crate::{ - layouts::{GGLWEAutomorphismKey, GGLWESwitchingKey, prepared::GGSWCiphertextPrepared}, - trait_families::GLWEExternalProductFamily, -}; +use crate::layouts::{GGLWEAutomorphismKey, GGLWESwitchingKey, prepared::GGSWCiphertextPrepared}; impl GGLWEAutomorphismKey<Vec<u8>> { pub fn external_product_scratch_space<B: Backend>(

@@ -20,7 +20,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxNormalizeTmpBytes, { GGLWESwitchingKey::external_product_scratch_space(module, n, basek, k_out, k_in, ggsw_k, digits, rank) }

@@ -35,7 +35,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxNormalizeTmpBytes, { GGLWESwitchingKey::external_product_inplace_scratch_space(module, n, basek, k_out, ggsw_k, digits, rank) }

@@ -49,7 +49,14 @@ lhs: &GGLWEAutomorphismKey<DataLhs>,

rhs: &GGSWCiphertextPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { self.key.external_product(module, &lhs.key, rhs, scratch);

@@ -61,7 +68,14 @@ module: &Module<B>,

rhs: &GGSWCiphertextPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { self.key.external_product_inplace(module, rhs, scratch);
M core/src/external_product/gglwe_ksk.rs → core/src/external_product/gglwe_ksk.rs

@@ -1,12 +1,12 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnxDft, ZnxZero}, + api::{ + ScratchAvailable, TakeVecZnxDft, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxNormalizeTmpBytes, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, }; -use crate::{ - layouts::{GGLWESwitchingKey, GLWECiphertext, Infos, prepared::GGSWCiphertextPrepared}, - trait_families::GLWEExternalProductFamily, -}; +use crate::layouts::{GGLWESwitchingKey, GLWECiphertext, Infos, prepared::GGSWCiphertextPrepared}; impl GGLWESwitchingKey<Vec<u8>> { pub fn external_product_scratch_space<B: Backend>(

@@ -20,7 +20,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxNormalizeTmpBytes, { GLWECiphertext::external_product_scratch_space(module, n, basek, k_out, k_in, k_ggsw, digits, rank) }

@@ -35,7 +35,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxNormalizeTmpBytes, { GLWECiphertext::external_product_inplace_scratch_space(module, n, basek, k_out, k_ggsw, digits, rank) }

@@ -49,7 +49,14 @@ lhs: &GGLWESwitchingKey<DataLhs>,

rhs: &GGSWCiphertextPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { #[cfg(debug_assertions)]

@@ -97,7 +104,14 @@ module: &Module<B>,

rhs: &GGSWCiphertextPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { #[cfg(debug_assertions)]
M core/src/external_product/ggsw_ct.rs → core/src/external_product/ggsw_ct.rs

@@ -1,12 +1,12 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnxDft, ZnxZero}, + api::{ + ScratchAvailable, TakeVecZnxDft, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxNormalizeTmpBytes, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, }; -use crate::{ - layouts::{GGSWCiphertext, GLWECiphertext, Infos, prepared::GGSWCiphertextPrepared}, - trait_families::GLWEExternalProductFamily, -}; +use crate::layouts::{GGSWCiphertext, GLWECiphertext, Infos, prepared::GGSWCiphertextPrepared}; impl GGSWCiphertext<Vec<u8>> { pub fn external_product_scratch_space<B: Backend>(

@@ -20,7 +20,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxNormalizeTmpBytes, { GLWECiphertext::external_product_scratch_space(module, n, basek, k_out, k_in, k_ggsw, digits, rank) }

@@ -35,7 +35,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxNormalizeTmpBytes, { GLWECiphertext::external_product_inplace_scratch_space(module, n, basek, k_out, k_ggsw, digits, rank) }

@@ -49,8 +49,15 @@ lhs: &GGSWCiphertext<DataLhs>,

rhs: &GGSWCiphertextPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEExternalProductFamily<B>, - Scratch<B>: ScratchAvailable + TakeVecZnxDft<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B>, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { #[cfg(debug_assertions)] {

@@ -108,7 +115,14 @@ module: &Module<B>,

rhs: &GGSWCiphertextPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { #[cfg(debug_assertions)]
M core/src/external_product/glwe_ct.rs → core/src/external_product/glwe_ct.rs

@@ -6,10 +6,7 @@ },

layouts::{Backend, DataMut, DataRef, Module, Scratch, VecZnxBig}, }; -use crate::{ - layouts::{GLWECiphertext, Infos, prepared::GGSWCiphertextPrepared}, - trait_families::GLWEExternalProductFamily, -}; +use crate::layouts::{GLWECiphertext, Infos, prepared::GGSWCiphertextPrepared}; impl GLWECiphertext<Vec<u8>> { pub fn external_product_scratch_space<B: Backend>(

@@ -23,7 +20,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxNormalizeTmpBytes, { let in_size: usize = k_in.div_ceil(basek).div_ceil(digits); let out_size: usize = k_out.div_ceil(basek);

@@ -53,7 +50,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxNormalizeTmpBytes, { Self::external_product_scratch_space(module, n, basek, k_out, k_out, k_ggsw, digits, rank) }

@@ -67,7 +64,14 @@ lhs: &GLWECiphertext<DataLhs>,

rhs: &GGSWCiphertextPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { let basek: usize = self.basek();

@@ -144,7 +148,14 @@ module: &Module<B>,

rhs: &GGSWCiphertextPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEExternalProductFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { unsafe {
M core/src/glwe_packing.rs → core/src/glwe_packing.rs

@@ -1,7 +1,13 @@

use std::collections::HashMap; use backend::hal::{ - api::{ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxCopy}, + api::{ + ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAutomorphismInplace, VecZnxBigAddSmallInplace, + VecZnxBigAutomorphismInplace, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxBigSubSmallBInplace, VecZnxCopy, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxNegateInplace, VecZnxNormalizeInplace, + VecZnxRotate, VecZnxRotateInplace, VecZnxRshInplace, VecZnxSub, VecZnxSubABInplace, VmpApply, VmpApplyAdd, + VmpApplyTmpBytes, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -9,8 +15,6 @@ use crate::{

GLWEOperations, TakeGLWECt, layouts::{GLWECiphertext, Infos, prepared::GGLWEAutomorphismKeyPrepared}, }; - -use crate::trait_families::{GLWEKeyswitchFamily, GLWEPackingFamily}; /// [GLWEPacker] enables only the fly GLWE packing /// with constant memory of Log(N) ciphertexts.

@@ -93,7 +97,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { pack_core_scratch_space(module, n, basek, ct_k, k_ksk, digits, rank) }

@@ -118,7 +122,27 @@ a: Option<&GLWECiphertext<DataA>>,

auto_keys: &HashMap<i64, GGLWEAutomorphismKeyPrepared<DataAK, B>>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEPackingFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxCopy + + VecZnxRotateInplace + + VecZnxSub + + VecZnxNegateInplace + + VecZnxRshInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxSubABInplace + + VecZnxRotate + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxBigAutomorphismInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { assert!(

@@ -164,7 +188,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { combine_scratch_space(module, n, basek, ct_k, k_ksk, digits, rank) }

@@ -177,7 +201,27 @@ i: usize,

auto_keys: &HashMap<i64, GGLWEAutomorphismKeyPrepared<DataAK, B>>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEPackingFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxCopy + + VecZnxRotateInplace + + VecZnxSub + + VecZnxNegateInplace + + VecZnxRshInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxSubABInplace + + VecZnxRotate + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxBigAutomorphismInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { let log_n: usize = module.log_n();

@@ -239,7 +283,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GLWECiphertext::bytes_of(n, basek, ct_k, rank) + (GLWECiphertext::rsh_scratch_space(n)

@@ -255,7 +299,27 @@ i: usize,

auto_keys: &HashMap<i64, GGLWEAutomorphismKeyPrepared<DataAK, B>>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEPackingFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxCopy + + VecZnxRotateInplace + + VecZnxSub + + VecZnxNegateInplace + + VecZnxRshInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxSubABInplace + + VecZnxRotate + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxBigAutomorphismInplace<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { let n: usize = acc.data.n();
M core/src/glwe_trace.rs → core/src/glwe_trace.rs

@@ -1,13 +1,18 @@

use std::collections::HashMap; -use backend::hal::layouts::{Backend, DataMut, DataRef, Module, Scratch}; +use backend::hal::{ + api::{ + ScratchAvailable, TakeVecZnxDft, VecZnxBigAddSmallInplace, VecZnxBigAutomorphismInplace, VecZnxBigNormalize, + VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, + VecZnxRshInplace, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, + }, + layouts::{Backend, DataMut, DataRef, Module, Scratch}, +}; use crate::{ layouts::{GLWECiphertext, prepared::GGLWEAutomorphismKeyPrepared}, operations::GLWEOperations, }; - -use crate::trait_families::{GLWETraceModuleFamily, GLWETraceScratchFamily}; impl GLWECiphertext<Vec<u8>> { pub fn trace_galois_elements<B: Backend>(module: &Module<B>) -> Vec<i64> {

@@ -33,7 +38,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWETraceModuleFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { Self::automorphism_inplace_scratch_space(module, n, basek, out_k.min(in_k), ksk_k, digits, rank) }

@@ -48,7 +53,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWETraceModuleFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { Self::automorphism_inplace_scratch_space(module, n, basek, out_k, ksk_k, digits, rank) }

@@ -64,8 +69,19 @@ lhs: &GLWECiphertext<DataLhs>,

auto_keys: &HashMap<i64, GGLWEAutomorphismKeyPrepared<DataAK, B>>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWETraceModuleFamily<B>, - Scratch<B>: GLWETraceScratchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace + + VecZnxCopy, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { self.copy(module, lhs); self.trace_inplace(module, start, end, auto_keys, scratch);

@@ -79,8 +95,18 @@ end: usize,

auto_keys: &HashMap<i64, GGLWEAutomorphismKeyPrepared<DataAK, B>>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWETraceModuleFamily<B>, - Scratch<B>: GLWETraceScratchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace, + Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { (start..end).for_each(|i| { self.rsh(module, 1);
M core/src/keyswitching/gglwe_ct.rs → core/src/keyswitching/gglwe_ct.rs

@@ -1,14 +1,14 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnxDft, ZnxZero}, + api::{ + ScratchAvailable, TakeVecZnxDft, VecZnxBigAddSmallInplace, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, }; -use crate::{ - layouts::{ - GGLWEAutomorphismKey, GGLWESwitchingKey, GLWECiphertext, Infos, - prepared::{GGLWEAutomorphismKeyPrepared, GGLWESwitchingKeyPrepared}, - }, - trait_families::GLWEKeyswitchFamily, +use crate::layouts::{ + GGLWEAutomorphismKey, GGLWESwitchingKey, GLWECiphertext, Infos, + prepared::{GGLWEAutomorphismKeyPrepared, GGLWESwitchingKeyPrepared}, }; impl GGLWEAutomorphismKey<Vec<u8>> {

@@ -23,7 +23,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GGLWESwitchingKey::keyswitch_scratch_space(module, n, basek, k_out, k_in, k_ksk, digits, rank, rank) }

@@ -38,7 +38,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GGLWESwitchingKey::keyswitch_inplace_scratch_space(module, n, basek, k_out, k_ksk, digits, rank) }

@@ -52,7 +52,15 @@ lhs: &GGLWEAutomorphismKey<DataLhs>,

rhs: &GGLWESwitchingKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { self.key.keyswitch(module, &lhs.key, rhs, scratch);

@@ -64,7 +72,15 @@ module: &Module<B>,

rhs: &GGLWEAutomorphismKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, { self.key.keyswitch_inplace(module, &rhs.key, scratch);

@@ -84,7 +100,7 @@ rank_in: usize,

rank_out: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GLWECiphertext::keyswitch_scratch_space( module, n, basek, k_out, k_in, k_ksk, digits, rank_in, rank_out,

@@ -101,7 +117,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { GLWECiphertext::keyswitch_inplace_scratch_space(module, n, basek, k_out, k_ksk, digits, rank) }

@@ -115,8 +131,16 @@ lhs: &GGLWESwitchingKey<DataLhs>,

rhs: &GGLWESwitchingKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B>, - Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B>, { #[cfg(debug_assertions)] {

@@ -163,8 +187,16 @@ module: &Module<B>,

rhs: &GGLWESwitchingKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B>, - Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B>, { #[cfg(debug_assertions)] {
M core/src/keyswitching/ggsw_ct.rs → core/src/keyswitching/ggsw_ct.rs

@@ -1,7 +1,9 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeVecZnx, TakeVecZnxBig, TakeVecZnxDft, VecZnxBigAllocBytes, VecZnxCopy, VecZnxDftAddInplace, - VecZnxDftCopy, VecZnxDftToVecZnxBigTmpA, VecZnxNormalizeTmpBytes, ZnxInfos, + ScratchAvailable, TakeVecZnxBig, TakeVecZnxDft, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, VecZnxBigNormalize, + VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAddInplace, VecZnxDftAllocBytes, VecZnxDftCopy, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, VecZnxNormalizeTmpBytes, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, + ZnxInfos, }, layouts::{Backend, DataMut, DataRef, Module, Scratch, VecZnx, VmpPMat}, };

@@ -12,7 +14,6 @@ GGLWECiphertext, GGSWCiphertext, GLWECiphertext, Infos,

prepared::{GGLWESwitchingKeyPrepared, GGLWETensorKeyPrepared}, }, operations::GLWEOperations, - trait_families::{GGSWKeySwitchFamily, GLWEKeyswitchFamily}, }; impl GGSWCiphertext<Vec<u8>> {

@@ -26,7 +27,7 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigAllocBytes + VecZnxNormalizeTmpBytes, { let tsk_size: usize = k_tsk.div_ceil(basek); let self_size_out: usize = self_k.div_ceil(basek);

@@ -61,7 +62,8 @@ digits_tsk: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, + Module<B>: + VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigAllocBytes + VecZnxNormalizeTmpBytes + VecZnxBigNormalizeTmpBytes, { let out_size: usize = k_out.div_ceil(basek); let res_znx: usize = VecZnx::alloc_bytes(n, rank + 1, out_size);

@@ -84,7 +86,8 @@ digits_tsk: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, + Module<B>: + VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigAllocBytes + VecZnxNormalizeTmpBytes + VecZnxBigNormalizeTmpBytes, { GGSWCiphertext::keyswitch_scratch_space( module, n, basek, k_out, k_out, k_ksk, digits_ksk, k_tsk, digits_tsk, rank,

@@ -102,8 +105,19 @@ scratch: &mut Scratch<B>,

) where DataA: DataRef, DataTsk: DataRef, - Module<B>: GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes + VecZnxCopy, - Scratch<B>: TakeVecZnxDft<B> + TakeVecZnxBig<B> + ScratchAvailable + TakeVecZnx, + Module<B>: VecZnxCopy + + VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigAllocBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VecZnxDftCopy<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftAddInplace<B> + + VecZnxBigNormalize<B> + + VecZnxDftToVecZnxBigTmpA<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B>, { #[cfg(debug_assertions)] {

@@ -127,8 +141,22 @@ ksk: &GGLWESwitchingKeyPrepared<DataKsk, B>,

tsk: &GGLWETensorKeyPrepared<DataTsk, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, - Scratch<B>: TakeVecZnxDft<B> + TakeVecZnxBig<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftCopy<B> + + VecZnxDftAddInplace<B> + + VecZnxDftToVecZnxBigTmpA<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B>, { self.keyswitch_internal(module, lhs, ksk, scratch); self.expand_row(module, tsk, scratch);

@@ -141,8 +169,22 @@ ksk: &GGLWESwitchingKeyPrepared<DataKsk, B>,

tsk: &GGLWETensorKeyPrepared<DataTsk, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, - Scratch<B>: TakeVecZnxDft<B> + TakeVecZnxBig<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftCopy<B> + + VecZnxDftAddInplace<B> + + VecZnxDftToVecZnxBigTmpA<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B>, { unsafe { let self_ptr: *mut GGSWCiphertext<DataSelf> = self as *mut GGSWCiphertext<DataSelf>;

@@ -156,8 +198,18 @@ module: &Module<B>,

tsk: &GGLWETensorKeyPrepared<DataTsk, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, - Scratch<B>: TakeVecZnxDft<B> + TakeVecZnxBig<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigAllocBytes + + VecZnxNormalizeTmpBytes + + VecZnxDftFromVecZnx<B> + + VecZnxDftCopy<B> + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftAddInplace<B> + + VecZnxBigNormalize<B> + + VecZnxDftToVecZnxBigTmpA<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B> + TakeVecZnxBig<B>, { assert!( scratch.available()

@@ -281,8 +333,16 @@ lhs: &GGSWCiphertext<DataLhs>,

ksk: &GGLWESwitchingKeyPrepared<DataKsk, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B> + GGSWKeySwitchFamily<B> + VecZnxNormalizeTmpBytes, - Scratch<B>: TakeVecZnxDft<B> + TakeVecZnxBig<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B>, { // Keyswitch the j-th row of the col 0 (0..lhs.rows()).for_each(|row_i| {
M core/src/keyswitching/glwe_ct.rs → core/src/keyswitching/glwe_ct.rs

@@ -6,10 +6,7 @@ },

layouts::{Backend, DataMut, DataRef, Module, Scratch, VecZnx, VecZnxBig, VecZnxDft, VmpPMat}, }; -use crate::{ - layouts::{GLWECiphertext, Infos, prepared::GGLWESwitchingKeyPrepared}, - trait_families::GLWEKeyswitchFamily, -}; +use crate::layouts::{GLWECiphertext, Infos, prepared::GGLWESwitchingKeyPrepared}; impl GLWECiphertext<Vec<u8>> { pub fn keyswitch_scratch_space<B: Backend>(

@@ -24,7 +21,7 @@ rank_in: usize,

rank_out: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { let in_size: usize = k_in.div_ceil(basek).div_ceil(digits); let out_size: usize = k_out.div_ceil(basek);

@@ -54,13 +51,14 @@ digits: usize,

rank: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, { Self::keyswitch_scratch_space(module, n, basek, k_out, k_out, k_ksk, digits, rank, rank) } } impl<DataSelf: DataRef> GLWECiphertext<DataSelf> { + #[allow(dead_code)] pub(crate) fn assert_keyswitch<B: Backend, DataLhs, DataRhs>( &self, module: &Module<B>,

@@ -70,7 +68,7 @@ scratch: &Scratch<B>,

) where DataLhs: DataRef, DataRhs: DataRef, - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + VmpApplyTmpBytes + VecZnxBigNormalizeTmpBytes, Scratch<B>: ScratchAvailable, { let basek: usize = self.basek();

@@ -139,8 +137,17 @@ lhs: &GLWECiphertext<DataLhs>,

rhs: &GGLWESwitchingKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B>, - Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B>, { #[cfg(debug_assertions)] {

@@ -159,8 +166,17 @@ module: &Module<B>,

rhs: &GGLWESwitchingKeyPrepared<DataRhs, B>, scratch: &mut Scratch<B>, ) where - Module<B>: GLWEKeyswitchFamily<B>, - Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, + Scratch<B>: ScratchAvailable + TakeVecZnxDft<B>, { unsafe { let self_ptr: *mut GLWECiphertext<DataSelf> = self as *mut GLWECiphertext<DataSelf>;

@@ -180,7 +196,16 @@ ) -> VecZnxBig<DataRes, B>

where DataRes: DataMut, DataKey: DataRef, - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B>, { if rhs.digits() == 1 {
M core/src/keyswitching/lwe_ct.rs → core/src/keyswitching/lwe_ct.rs

@@ -1,5 +1,9 @@

use backend::hal::{ - api::{ScratchAvailable, TakeVecZnx, TakeVecZnxDft, ZnxView, ZnxViewMut, ZnxZero}, + api::{ + ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxBigAddSmallInplace, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, ZnxView, + ZnxViewMut, ZnxZero, + }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, };

@@ -7,8 +11,6 @@ use crate::{

TakeGLWECt, layouts::{GLWECiphertext, Infos, LWECiphertext, prepared::LWESwitchingKeyPrepared}, }; - -use crate::trait_families::GLWEKeyswitchFamily; impl LWECiphertext<Vec<u8>> { pub fn keyswitch_scratch_space<B: Backend>(

@@ -20,7 +22,16 @@ k_lwe_in: usize,

k_ksk: usize, ) -> usize where - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, { GLWECiphertext::bytes_of(n, basek, k_lwe_out.max(k_lwe_in), 1) + GLWECiphertext::keyswitch_inplace_scratch_space(module, n, basek, k_lwe_out, k_ksk, 1, 1)

@@ -37,7 +48,15 @@ scratch: &mut Scratch<B>,

) where A: DataRef, DKs: DataRef, - Module<B>: GLWEKeyswitchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]
M core/src/layouts/compressed/gglwe_atk.rs → core/src/layouts/compressed/gglwe_atk.rs

@@ -3,11 +3,12 @@ api::{FillUniform, Reset, VecZnxCopy, VecZnxFillUniform},

layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; -use crate::layouts::{GGLWEAutomorphismKey, Infos, compressed::GGLWESwitchingKeyCompressed}; +use crate::layouts::{ + GGLWEAutomorphismKey, Infos, + compressed::{Decompress, GGLWESwitchingKeyCompressed}, +}; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; use std::fmt; - -use crate::trait_families::Decompress; #[derive(PartialEq, Eq, Clone)] pub struct GGLWEAutomorphismKeyCompressed<D: Data> {
M core/src/layouts/compressed/gglwe_ct.rs → core/src/layouts/compressed/gglwe_ct.rs

@@ -3,11 +3,12 @@ api::{FillUniform, Reset, VecZnxCopy, VecZnxFillUniform},

layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; -use crate::layouts::{GGLWECiphertext, Infos, compressed::GLWECiphertextCompressed}; +use crate::layouts::{ + GGLWECiphertext, Infos, + compressed::{Decompress, GLWECiphertextCompressed}, +}; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; use std::fmt; - -use crate::trait_families::Decompress; #[derive(PartialEq, Eq, Clone)] pub struct GGLWECiphertextCompressed<D: Data> {
M core/src/layouts/compressed/gglwe_ksk.rs → core/src/layouts/compressed/gglwe_ksk.rs

@@ -3,9 +3,9 @@ api::{FillUniform, Reset, VecZnxCopy, VecZnxFillUniform},

layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; -use crate::{ - layouts::{GGLWESwitchingKey, Infos, compressed::GGLWECiphertextCompressed}, - trait_families::Decompress, +use crate::layouts::{ + GGLWESwitchingKey, Infos, + compressed::{Decompress, GGLWECiphertextCompressed}, }; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; use std::fmt;
M core/src/layouts/compressed/gglwe_tsk.rs → core/src/layouts/compressed/gglwe_tsk.rs

@@ -3,11 +3,12 @@ api::{FillUniform, Reset, VecZnxCopy, VecZnxFillUniform},

layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; -use crate::layouts::{GGLWETensorKey, Infos, compressed::GGLWESwitchingKeyCompressed}; +use crate::layouts::{ + GGLWETensorKey, Infos, + compressed::{Decompress, GGLWESwitchingKeyCompressed}, +}; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; use std::fmt; - -use crate::trait_families::Decompress; #[derive(PartialEq, Eq, Clone)] pub struct GGLWETensorKeyCompressed<D: Data> {
M core/src/layouts/compressed/ggsw_ct.rs → core/src/layouts/compressed/ggsw_ct.rs

@@ -3,9 +3,9 @@ api::{FillUniform, Reset, VecZnxCopy, VecZnxFillUniform},

layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; -use crate::{ - layouts::{GGSWCiphertext, Infos, compressed::GLWECiphertextCompressed}, - trait_families::Decompress, +use crate::layouts::{ + GGSWCiphertext, Infos, + compressed::{Decompress, GLWECiphertextCompressed}, }; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; use std::fmt;
M core/src/layouts/compressed/glwe_ct.rs → core/src/layouts/compressed/glwe_ct.rs

@@ -1,13 +1,10 @@

use backend::hal::{ - api::{FillUniform, Reset, VecZnxCopy, VecZnxFillUniform, ZnxInfos}, + api::{FillUniform, Reset, VecZnxCopy, VecZnxFillUniform}, layouts::{Backend, Data, DataMut, DataRef, Module, ReaderFrom, VecZnx, WriterTo}, }; use sampling::source::Source; -use crate::{ - layouts::{GLWECiphertext, Infos}, - trait_families::{Decompress, DecompressFamily}, -}; +use crate::layouts::{GLWECiphertext, Infos, compressed::Decompress}; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; use std::fmt;

@@ -117,10 +114,12 @@

impl<D: DataMut, B: Backend, DR: DataRef> Decompress<B, GLWECiphertextCompressed<DR>> for GLWECiphertext<D> { fn decompress(&mut self, module: &Module<B>, other: &GLWECiphertextCompressed<DR>) where - Module<B>: DecompressFamily<B>, + Module<B>: VecZnxCopy + VecZnxFillUniform, { #[cfg(debug_assertions)] { + use backend::hal::api::ZnxInfos; + assert_eq!( self.n(), other.data.n(),

@@ -142,9 +141,10 @@ "invalid receiver: self.rank()={} != other.rank()={}",

self.rank(), other.rank() ); - let mut source: Source = Source::new(other.seed); - self.decompress_internal(module, other, &mut source); } + + let mut source: Source = Source::new(other.seed); + self.decompress_internal(module, other, &mut source); } }

@@ -156,7 +156,7 @@ other: &GLWECiphertextCompressed<DataOther>,

source: &mut Source, ) where DataOther: DataRef, - Module<B>: DecompressFamily<B>, + Module<B>: VecZnxCopy + VecZnxFillUniform, { #[cfg(debug_assertions)] {
M core/src/layouts/compressed/glwe_to_lwe_ksk.rs → core/src/layouts/compressed/glwe_to_lwe_ksk.rs

@@ -2,12 +2,15 @@ use std::fmt;

use backend::hal::{ api::{FillUniform, Reset}, + api::{ + SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, VecZnxAddNormal, VecZnxBigNormalize, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + }, layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; use crate::layouts::{GLWEToLWESwitchingKey, Infos, compressed::GGLWESwitchingKeyCompressed}; - -use crate::trait_families::{GGLWEEncryptSkFamily, GLWESecretPreparedModuleFamily}; #[derive(PartialEq, Eq, Clone)] pub struct GLWEToLWESwitchingKeyCompressed<D: Data>(pub(crate) GGLWESwitchingKeyCompressed<D>);

@@ -91,7 +94,22 @@ }

pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank_in: usize) -> usize where - Module<B>: GGLWEEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B>, { GLWEToLWESwitchingKey::encrypt_sk_scratch_space(module, n, basek, k, rank_in) }
M core/src/layouts/compressed/lwe_ct.rs → core/src/layouts/compressed/lwe_ct.rs

@@ -6,10 +6,7 @@ layouts::{Backend, Data, DataMut, DataRef, Module, ReaderFrom, VecZnx, WriterTo},

}; use sampling::source::Source; -use crate::{ - layouts::{Infos, LWECiphertext, SetMetaData}, - trait_families::Decompress, -}; +use crate::layouts::{Infos, LWECiphertext, SetMetaData, compressed::Decompress}; #[derive(PartialEq, Eq, Clone)] pub struct LWECiphertextCompressed<D: Data> {
M core/src/layouts/compressed/lwe_ksk.rs → core/src/layouts/compressed/lwe_ksk.rs

@@ -1,12 +1,17 @@

use backend::hal::{ - api::{FillUniform, Reset}, + api::{ + FillUniform, Reset, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, VecZnxAddNormal, + VecZnxBigNormalize, VecZnxCopy, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + }, layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; -use crate::layouts::{Infos, LWESwitchingKey, compressed::GGLWESwitchingKeyCompressed}; +use crate::layouts::{ + Infos, LWESwitchingKey, + compressed::{Decompress, GGLWESwitchingKeyCompressed}, +}; use std::fmt; - -use crate::trait_families::{Decompress, GGLWEEncryptSkFamily, GLWESecretPreparedModuleFamily}; #[derive(PartialEq, Eq, Clone)] pub struct LWESwitchingKeyCompressed<D: Data>(pub(crate) GGLWESwitchingKeyCompressed<D>);

@@ -90,7 +95,22 @@ }

pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize where - Module<B>: GGLWEEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B>, { LWESwitchingKey::encrypt_sk_scratch_space(module, n, basek, k) }

@@ -99,7 +119,7 @@

impl<D: DataMut, DR: DataRef, B: Backend> Decompress<B, LWESwitchingKeyCompressed<DR>> for LWESwitchingKey<D> { fn decompress(&mut self, module: &Module<B>, other: &LWESwitchingKeyCompressed<DR>) where - Module<B>: crate::trait_families::DecompressFamily<B>, + Module<B>: VecZnxCopy + VecZnxFillUniform, { self.0.decompress(module, &other.0); }
M core/src/layouts/compressed/lwe_to_glwe_ksk.rs → core/src/layouts/compressed/lwe_to_glwe_ksk.rs

@@ -1,15 +1,18 @@

use backend::hal::{ api::{FillUniform, Reset}, + api::{ + SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, VecZnxAddNormal, VecZnxBigNormalize, + VecZnxCopy, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + }, layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; -use crate::{ - layouts::{Infos, LWEToGLWESwitchingKey, compressed::GGLWESwitchingKeyCompressed}, - trait_families::Decompress, +use crate::layouts::{ + Infos, LWEToGLWESwitchingKey, + compressed::{Decompress, GGLWESwitchingKeyCompressed}, }; use std::fmt; - -use crate::trait_families::{GGLWEEncryptSkFamily, GLWESecretPreparedModuleFamily}; #[derive(PartialEq, Eq, Clone)] pub struct LWEToGLWESwitchingKeyCompressed<D: Data>(pub(crate) GGLWESwitchingKeyCompressed<D>);

@@ -93,7 +96,22 @@ }

pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank_out: usize) -> usize where - Module<B>: GGLWEEncryptSkFamily<B> + GLWESecretPreparedModuleFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B>, { LWEToGLWESwitchingKey::encrypt_sk_scratch_space(module, n, basek, k, rank_out) }

@@ -102,7 +120,7 @@

impl<D: DataMut, DR: DataRef, B: Backend> Decompress<B, LWEToGLWESwitchingKeyCompressed<DR>> for LWEToGLWESwitchingKey<D> { fn decompress(&mut self, module: &Module<B>, other: &LWEToGLWESwitchingKeyCompressed<DR>) where - Module<B>: crate::trait_families::DecompressFamily<B>, + Module<B>: VecZnxCopy + VecZnxFillUniform, { self.0.decompress(module, &other.0); }
M core/src/layouts/compressed/mod.rs → core/src/layouts/compressed/mod.rs

@@ -19,3 +19,14 @@ pub use glwe_to_lwe_ksk::*;

pub use lwe_ct::*; pub use lwe_ksk::*; pub use lwe_to_glwe_ksk::*; + +use backend::hal::{ + api::{VecZnxCopy, VecZnxFillUniform}, + layouts::{Backend, Module}, +}; + +pub trait Decompress<B: Backend, C> { + fn decompress(&mut self, module: &Module<B>, other: &C) + where + Module<B>: VecZnxFillUniform + VecZnxCopy; +}
M core/src/layouts/lwe_pt.rs → core/src/layouts/lwe_pt.rs

@@ -87,3 +87,9 @@ k: self.k,

} } } + +impl<D: DataMut> LWEPlaintext<D> { + pub fn data_mut(&mut self) -> &mut VecZnx<D> { + &mut self.data + } +}
M core/src/layouts/prepared/gglwe_atk.rs → core/src/layouts/prepared/gglwe_atk.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare}, + api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat}, };

@@ -73,7 +73,7 @@ }

impl<D: DataMut, DR: DataRef, B: Backend> Prepare<B, GGLWEAutomorphismKey<DR>> for GGLWEAutomorphismKeyPrepared<D, B> where - Module<B>: VmpPMatPrepare<B>, + Module<B>: VmpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &GGLWEAutomorphismKey<DR>, scratch: &mut Scratch<B>) { self.key.prepare(module, &other.key, scratch);

@@ -83,7 +83,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, GGLWEAutomorphismKeyPrepared<Vec<u8>, B>> for GGLWEAutomorphismKey<D> where - Module<B>: VmpPMatAlloc<B> + VmpPMatPrepare<B>, + Module<B>: VmpPMatAlloc<B> + VmpPrepare<B>, { fn prepare_alloc(&self, module: &Module<B>, scratch: &mut Scratch<B>) -> GGLWEAutomorphismKeyPrepared<Vec<u8>, B> { let mut atk_prepared: GGLWEAutomorphismKeyPrepared<Vec<u8>, B> = GGLWEAutomorphismKeyPrepared::alloc(
M core/src/layouts/prepared/gglwe_ct.rs → core/src/layouts/prepared/gglwe_ct.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare}, + api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat}, };

@@ -123,7 +123,7 @@ }

impl<D: DataMut, DR: DataRef, B: Backend> Prepare<B, GGLWECiphertext<DR>> for GGLWECiphertextPrepared<D, B> where - Module<B>: VmpPMatPrepare<B>, + Module<B>: VmpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &GGLWECiphertext<DR>, scratch: &mut Scratch<B>) { module.vmp_prepare(&mut self.data, &other.data, scratch);

@@ -135,7 +135,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, GGLWECiphertextPrepared<Vec<u8>, B>> for GGLWECiphertext<D> where - Module<B>: VmpPMatAlloc<B> + VmpPMatPrepare<B>, + Module<B>: VmpPMatAlloc<B> + VmpPrepare<B>, { fn prepare_alloc(&self, module: &Module<B>, scratch: &mut Scratch<B>) -> GGLWECiphertextPrepared<Vec<u8>, B> { let mut atk_prepared: GGLWECiphertextPrepared<Vec<u8>, B> = GGLWECiphertextPrepared::alloc(
M core/src/layouts/prepared/gglwe_ksk.rs → core/src/layouts/prepared/gglwe_ksk.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare}, + api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat}, };

@@ -97,7 +97,7 @@ }

impl<D: DataMut, DR: DataRef, B: Backend> Prepare<B, GGLWESwitchingKey<DR>> for GGLWESwitchingKeyPrepared<D, B> where - Module<B>: VmpPMatPrepare<B>, + Module<B>: VmpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &GGLWESwitchingKey<DR>, scratch: &mut Scratch<B>) { self.key.prepare(module, &other.key, scratch);

@@ -108,7 +108,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, GGLWESwitchingKeyPrepared<Vec<u8>, B>> for GGLWESwitchingKey<D> where - Module<B>: VmpPMatAlloc<B> + VmpPMatPrepare<B>, + Module<B>: VmpPMatAlloc<B> + VmpPrepare<B>, { fn prepare_alloc(&self, module: &Module<B>, scratch: &mut Scratch<B>) -> GGLWESwitchingKeyPrepared<Vec<u8>, B> { let mut atk_prepared: GGLWESwitchingKeyPrepared<Vec<u8>, B> = GGLWESwitchingKeyPrepared::alloc(
M core/src/layouts/prepared/gglwe_tsk.rs → core/src/layouts/prepared/gglwe_tsk.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare}, + api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat}, };

@@ -95,7 +95,7 @@ }

impl<D: DataMut, DR: DataRef, B: Backend> Prepare<B, GGLWETensorKey<DR>> for GGLWETensorKeyPrepared<D, B> where - Module<B>: VmpPMatPrepare<B>, + Module<B>: VmpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &GGLWETensorKey<DR>, scratch: &mut Scratch<B>) { #[cfg(debug_assertions)]

@@ -113,7 +113,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, GGLWETensorKeyPrepared<Vec<u8>, B>> for GGLWETensorKey<D> where - Module<B>: VmpPMatAlloc<B> + VmpPMatPrepare<B>, + Module<B>: VmpPMatAlloc<B> + VmpPrepare<B>, { fn prepare_alloc(&self, module: &Module<B>, scratch: &mut Scratch<B>) -> GGLWETensorKeyPrepared<Vec<u8>, B> { let mut tsk_prepared: GGLWETensorKeyPrepared<Vec<u8>, B> = GGLWETensorKeyPrepared::alloc(
M core/src/layouts/prepared/ggsw_ct.rs → core/src/layouts/prepared/ggsw_ct.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare}, + api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat}, };

@@ -105,7 +105,7 @@ }

impl<D: DataMut, DR: DataRef, B: Backend> Prepare<B, GGSWCiphertext<DR>> for GGSWCiphertextPrepared<D, B> where - Module<B>: VmpPMatPrepare<B>, + Module<B>: VmpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &GGSWCiphertext<DR>, scratch: &mut Scratch<B>) { module.vmp_prepare(&mut self.data, &other.data, scratch);

@@ -117,7 +117,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, GGSWCiphertextPrepared<Vec<u8>, B>> for GGSWCiphertext<D> where - Module<B>: VmpPMatAlloc<B> + VmpPMatPrepare<B>, + Module<B>: VmpPMatAlloc<B> + VmpPrepare<B>, { fn prepare_alloc(&self, module: &Module<B>, scratch: &mut Scratch<B>) -> GGSWCiphertextPrepared<Vec<u8>, B> { let mut ggsw_prepared: GGSWCiphertextPrepared<Vec<u8>, B> = GGSWCiphertextPrepared::alloc(
M core/src/layouts/prepared/glwe_sk.rs → core/src/layouts/prepared/glwe_sk.rs

@@ -9,7 +9,6 @@ layouts::{

GLWESecret, prepared::{Prepare, PrepareAlloc}, }, - trait_families::GLWESecretPreparedModuleFamily, }; pub struct GLWESecretPrepared<D: Data, B: Backend> {

@@ -20,7 +19,7 @@

impl<B: Backend> GLWESecretPrepared<Vec<u8>, B> { pub fn alloc(module: &Module<B>, n: usize, rank: usize) -> Self where - Module<B>: GLWESecretPreparedModuleFamily<B>, + Module<B>: SvpPPolAlloc<B>, { Self { data: module.svp_ppol_alloc(n, rank),

@@ -30,7 +29,7 @@ }

pub fn bytes_of(module: &Module<B>, n: usize, rank: usize) -> usize where - Module<B>: GLWESecretPreparedModuleFamily<B>, + Module<B>: SvpPPolAllocBytes, { module.svp_ppol_alloc_bytes(n, rank) }

@@ -52,7 +51,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, GLWESecretPrepared<Vec<u8>, B>> for GLWESecret<D> where - Module<B>: SvpPrepare<B> + SvpPPolAllocBytes + SvpPPolAlloc<B>, + Module<B>: SvpPrepare<B> + SvpPPolAlloc<B>, { fn prepare_alloc( &self,
M core/src/layouts/prepared/glwe_to_lwe_ksk.rs → core/src/layouts/prepared/glwe_to_lwe_ksk.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare}, + api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat}, };

@@ -65,7 +65,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, GLWEToLWESwitchingKeyPrepared<Vec<u8>, B>> for GLWEToLWESwitchingKey<D> where - Module<B>: VmpPMatPrepare<B> + VmpPMatAlloc<B>, + Module<B>: VmpPrepare<B> + VmpPMatAlloc<B>, { fn prepare_alloc(&self, module: &Module<B>, scratch: &mut Scratch<B>) -> GLWEToLWESwitchingKeyPrepared<Vec<u8>, B> { let mut ksk_prepared: GLWEToLWESwitchingKeyPrepared<Vec<u8>, B> = GLWEToLWESwitchingKeyPrepared::alloc(

@@ -83,7 +83,7 @@ }

impl<DM: DataMut, DR: DataRef, B: Backend> Prepare<B, GLWEToLWESwitchingKey<DR>> for GLWEToLWESwitchingKeyPrepared<DM, B> where - Module<B>: VmpPMatPrepare<B>, + Module<B>: VmpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &GLWEToLWESwitchingKey<DR>, scratch: &mut Scratch<B>) { self.0.prepare(module, &other.0, scratch);
M core/src/layouts/prepared/lwe_ksk.rs → core/src/layouts/prepared/lwe_ksk.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare}, + api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat}, };

@@ -65,7 +65,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, LWESwitchingKeyPrepared<Vec<u8>, B>> for LWESwitchingKey<D> where - Module<B>: VmpPMatPrepare<B> + VmpPMatAlloc<B>, + Module<B>: VmpPrepare<B> + VmpPMatAlloc<B>, { fn prepare_alloc(&self, module: &Module<B>, scratch: &mut Scratch<B>) -> LWESwitchingKeyPrepared<Vec<u8>, B> { let mut ksk_prepared: LWESwitchingKeyPrepared<Vec<u8>, B> = LWESwitchingKeyPrepared::alloc(

@@ -82,7 +82,7 @@ }

impl<DM: DataMut, DR: DataRef, B: Backend> Prepare<B, LWESwitchingKey<DR>> for LWESwitchingKeyPrepared<DM, B> where - Module<B>: VmpPMatPrepare<B>, + Module<B>: VmpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &LWESwitchingKey<DR>, scratch: &mut Scratch<B>) { self.0.prepare(module, &other.0, scratch);
M core/src/layouts/prepared/lwe_to_glwe_ksk.rs → core/src/layouts/prepared/lwe_to_glwe_ksk.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare}, + api::{VmpPMatAlloc, VmpPMatAllocBytes, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat}, };

@@ -66,7 +66,7 @@ }

impl<D: DataRef, B: Backend> PrepareAlloc<B, LWEToGLWESwitchingKeyPrepared<Vec<u8>, B>> for LWEToGLWESwitchingKey<D> where - Module<B>: VmpPMatPrepare<B> + VmpPMatAlloc<B>, + Module<B>: VmpPrepare<B> + VmpPMatAlloc<B>, { fn prepare_alloc(&self, module: &Module<B>, scratch: &mut Scratch<B>) -> LWEToGLWESwitchingKeyPrepared<Vec<u8>, B> { let mut ksk_prepared: LWEToGLWESwitchingKeyPrepared<Vec<u8>, B> = LWEToGLWESwitchingKeyPrepared::alloc(

@@ -84,7 +84,7 @@ }

impl<DM: DataMut, DR: DataRef, B: Backend> Prepare<B, LWEToGLWESwitchingKey<DR>> for LWEToGLWESwitchingKeyPrepared<DM, B> where - Module<B>: VmpPMatPrepare<B>, + Module<B>: VmpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &LWEToGLWESwitchingKey<DR>, scratch: &mut Scratch<B>) { self.0.prepare(module, &other.0, scratch);
M core/src/lib.rs → core/src/lib.rs

@@ -1,4 +1,3 @@

-#![feature(trait_alias)] mod automorphism; mod conversion; mod decryption;

@@ -15,7 +14,6 @@ mod utils;

pub use operations::*; pub mod layouts; -pub mod trait_families; pub use dist::*; pub use glwe_packing::*;
M core/src/noise/gglwe_ct.rs → core/src/noise/gglwe_ct.rs

@@ -1,13 +1,14 @@

use backend::hal::{ - api::{ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxSubScalarInplace, ZnxZero}, + api::{ + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, + VecZnxNormalizeTmpBytes, VecZnxSubScalarInplace, ZnxZero, + }, layouts::{Backend, DataRef, Module, ScalarZnx, ScratchOwned}, oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeVecZnxBigImpl, TakeVecZnxDftImpl}, }; -use crate::{ - layouts::{GGLWECiphertext, GLWECiphertext, GLWEPlaintext, Infos, prepared::GLWESecretPrepared}, - trait_families::GLWEDecryptFamily, -}; +use crate::layouts::{GGLWECiphertext, GLWECiphertext, GLWEPlaintext, Infos, prepared::GLWESecretPrepared}; impl<D: DataRef> GGLWECiphertext<D> { pub fn assert_noise<B: Backend, DataSk, DataWant>(

@@ -19,7 +20,16 @@ max_noise: f64,

) where DataSk: DataRef, DataWant: DataRef, - Module<B>: GLWEDecryptFamily<B> + VecZnxSubScalarInplace, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxSubScalarInplace, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>, { let digits: usize = self.digits();
M core/src/noise/ggsw_ct.rs → core/src/noise/ggsw_ct.rs

@@ -1,16 +1,15 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxBigAlloc, VecZnxBigNormalize, VecZnxDftAlloc, - VecZnxDftToVecZnxBigTmpA, VecZnxNormalizeTmpBytes, VecZnxSubABInplace, ZnxZero, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, VecZnxAddScalarInplace, VecZnxBigAddInplace, + VecZnxBigAddSmallInplace, VecZnxBigAlloc, VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, + VecZnxDftAlloc, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, + VecZnxNormalizeTmpBytes, VecZnxSubABInplace, ZnxZero, }, layouts::{Backend, DataRef, Module, ScalarZnx, ScratchOwned, VecZnxBig, VecZnxDft}, oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeVecZnxBigImpl, TakeVecZnxDftImpl}, }; -use crate::{ - layouts::{GGSWCiphertext, GLWECiphertext, GLWEPlaintext, Infos, prepared::GLWESecretPrepared}, - trait_families::GGSWAssertNoiseFamily, -}; +use crate::layouts::{GGSWCiphertext, GLWECiphertext, GLWEPlaintext, Infos, prepared::GLWESecretPrepared}; impl<D: DataRef> GGSWCiphertext<D> { pub fn assert_noise<B: Backend, DataSk, DataScalar, F>(

@@ -22,7 +21,21 @@ max_noise: F,

) where DataSk: DataRef, DataScalar: DataRef, - Module<B>: GGSWAssertNoiseFamily<B> + VecZnxAddScalarInplace + VecZnxSubABInplace, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxAddScalarInplace + + VecZnxSubABInplace, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>, F: Fn(usize) -> f64, {

@@ -76,7 +89,21 @@ pt_want: &ScalarZnx<DataScalar>,

) where DataSk: DataRef, DataScalar: DataRef, - Module<B>: GGSWAssertNoiseFamily<B> + VecZnxAddScalarInplace + VecZnxSubABInplace, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxAddScalarInplace + + VecZnxSubABInplace, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>, { let basek: usize = self.basek();

@@ -110,7 +137,7 @@

module.vec_znx_sub_ab_inplace(&mut pt_have.data, 0, &pt.data, 0); let std_pt: f64 = pt_have.data.std(basek, 0).log2(); - println!("{}", std_pt); + println!("col: {} row: {}: {}", col_j, row_i, std_pt); pt.data.zero(); }); });
M core/src/noise/glwe_ct.rs → core/src/noise/glwe_ct.rs

@@ -1,5 +1,9 @@

use backend::hal::{ - api::{ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxNormalizeInplace, VecZnxSubABInplace}, + api::{ + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSubABInplace, + }, layouts::{Backend, DataRef, Module, ScratchOwned}, oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeVecZnxBigImpl, TakeVecZnxDftImpl}, };

@@ -8,7 +12,6 @@ use crate::{

layouts::GLWEPlaintext, layouts::prepared::GLWESecretPrepared, layouts::{GLWECiphertext, Infos}, - trait_families::GLWEDecryptFamily, }; impl<D: DataRef> GLWECiphertext<D> {

@@ -21,7 +24,17 @@ max_noise: f64,

) where DataSk: DataRef, DataPt: DataRef, - Module<B>: GLWEDecryptFamily<B> + VecZnxSubABInplace + VecZnxNormalizeInplace<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxSubABInplace + + VecZnxNormalizeInplace<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>, { let mut pt_have: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(self.n(), self.basek(), self.k());
M core/src/scratch.rs → core/src/scratch.rs

@@ -21,11 +21,11 @@ type Output;

fn take_like(&'a mut self, template: &T) -> (Self::Output, &'a mut Self); } -pub trait TakeGLWECt<B: Backend> { +pub trait TakeGLWECt { fn take_glwe_ct(&mut self, n: usize, basek: usize, k: usize, rank: usize) -> (GLWECiphertext<&mut [u8]>, &mut Self); } -pub trait TakeGLWECtSlice<B: Backend> { +pub trait TakeGLWECtSlice { fn take_glwe_ct_slice( &mut self, size: usize,

@@ -40,7 +40,7 @@ pub trait TakeGLWEPt<B: Backend> {

fn take_glwe_pt(&mut self, n: usize, basek: usize, k: usize) -> (GLWEPlaintext<&mut [u8]>, &mut Self); } -pub trait TakeGGLWE<B: Backend> { +pub trait TakeGGLWE { fn take_gglwe( &mut self, n: usize,

@@ -66,7 +66,7 @@ rank_out: usize,

) -> (GGLWECiphertextPrepared<&mut [u8], B>, &mut Self); } -pub trait TakeGGSW<B: Backend> { +pub trait TakeGGSW { fn take_ggsw( &mut self, n: usize,

@@ -90,7 +90,7 @@ rank: usize,

) -> (GGSWCiphertextPrepared<&mut [u8], B>, &mut Self); } -pub trait TakeGLWESecret<B: Backend> { +pub trait TakeGLWESecret { fn take_glwe_secret(&mut self, n: usize, rank: usize) -> (GLWESecret<&mut [u8]>, &mut Self); }

@@ -98,7 +98,7 @@ pub trait TakeGLWESecretPrepared<B: Backend> {

fn take_glwe_secret_prepared(&mut self, n: usize, rank: usize) -> (GLWESecretPrepared<&mut [u8], B>, &mut Self); } -pub trait TakeGLWEPk<B: Backend> { +pub trait TakeGLWEPk { fn take_glwe_pk(&mut self, n: usize, basek: usize, k: usize, rank: usize) -> (GLWEPublicKey<&mut [u8]>, &mut Self); }

@@ -112,7 +112,7 @@ rank: usize,

) -> (GLWEPublicKeyPrepared<&mut [u8], B>, &mut Self); } -pub trait TakeGLWESwitchingKey<B: Backend> { +pub trait TakeGLWESwitchingKey { fn take_glwe_switching_key( &mut self, n: usize,

@@ -138,7 +138,7 @@ rank_out: usize,

) -> (GGLWESwitchingKeyPrepared<&mut [u8], B>, &mut Self); } -pub trait TakeTensorKey<B: Backend> { +pub trait TakeTensorKey { fn take_tensor_key( &mut self, n: usize,

@@ -162,7 +162,7 @@ rank: usize,

) -> (GGLWETensorKeyPrepared<&mut [u8], B>, &mut Self); } -pub trait TakeAutomorphismKey<B: Backend> { +pub trait TakeAutomorphismKey { fn take_automorphism_key( &mut self, n: usize,

@@ -186,7 +186,7 @@ rank: usize,

) -> (GGLWEAutomorphismKeyPrepared<&mut [u8], B>, &mut Self); } -impl<B: Backend> TakeGLWECt<B> for Scratch<B> +impl<B: Backend> TakeGLWECt for Scratch<B> where Scratch<B>: TakeVecZnx, {

@@ -216,7 +216,7 @@ )

} } -impl<B: Backend> TakeGLWECtSlice<B> for Scratch<B> +impl<B: Backend> TakeGLWECtSlice for Scratch<B> where Scratch<B>: TakeVecZnx, {

@@ -269,7 +269,7 @@ )

} } -impl<B: Backend> TakeGGLWE<B> for Scratch<B> +impl<B: Backend> TakeGGLWE for Scratch<B> where Scratch<B>: TakeMatZnx, {

@@ -391,7 +391,7 @@ )

} } -impl<B: Backend> TakeGGSW<B> for Scratch<B> +impl<B: Backend> TakeGGSW for Scratch<B> where Scratch<B>: TakeMatZnx, {

@@ -511,7 +511,7 @@ )

} } -impl<B: Backend> TakeGLWEPk<B> for Scratch<B> +impl<B: Backend> TakeGLWEPk for Scratch<B> where Scratch<B>: TakeVecZnx, {

@@ -595,7 +595,7 @@ )

} } -impl<B: Backend> TakeGLWESecret<B> for Scratch<B> +impl<B: Backend> TakeGLWESecret for Scratch<B> where Scratch<B>: TakeScalarZnx, {

@@ -665,7 +665,7 @@ )

} } -impl<B: Backend> TakeGLWESwitchingKey<B> for Scratch<B> +impl<B: Backend> TakeGLWESwitchingKey for Scratch<B> where Scratch<B>: TakeMatZnx, {

@@ -759,7 +759,7 @@ )

} } -impl<B: Backend> TakeAutomorphismKey<B> for Scratch<B> +impl<B: Backend> TakeAutomorphismKey for Scratch<B> where Scratch<B>: TakeMatZnx, {

@@ -823,7 +823,7 @@ (GGLWEAutomorphismKeyPrepared { key, p: template.p }, scratch)

} } -impl<B: Backend> TakeTensorKey<B> for Scratch<B> +impl<B: Backend> TakeTensorKey for Scratch<B> where Scratch<B>: TakeMatZnx, {
M core/src/tests/generics/automorphism/gglwe_atk.rs → core/src/tests/generics/automorphism/gglwe_atk.rs

@@ -1,7 +1,11 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxCopy, - VecZnxSubScalarInplace, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxBigAddInplace, + VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxCopy, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSubScalarInplace, + VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -17,11 +21,8 @@ GGLWEAutomorphismKey, GLWEPlaintext, GLWESecret, Infos,

prepared::{GGLWEAutomorphismKeyPrepared, GLWESecretPrepared, Prepare, PrepareAlloc}, }, noise::log2_std_noise_gglwe_product, - trait_families::{GLWEDecryptFamily, GLWEKeyswitchFamily}, }; -use crate::trait_families::{GGLWEAutomorphismKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - pub fn test_gglwe_automorphism_key_automorphism<B: Backend>( module: &Module<B>, p0: i64,

@@ -34,19 +35,36 @@ k_apply: usize,

sigma: f64, rank: usize, ) where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEKeyswitchFamily<B> - + VecZnxAutomorphism - + VecZnxSwithcDegree - + VecZnxAddScalarInplace + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + VecZnxAutomorphism + VecZnxAutomorphismInplace - + GLWEDecryptFamily<B> - + VecZnxSubScalarInplace - + VecZnxCopy + + SvpPPolAllocBytes + + VecZnxDftAllocBytes + + VecZnxNormalizeTmpBytes + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B> + + SvpPrepare<B> + + SvpApplyInplace<B> + + VecZnxAddScalarInplace + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + VecZnxSwithcDegree + + SvpPPolAlloc<B> + + VecZnxBigAddInplace<B> + + VecZnxSubScalarInplace, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>

@@ -179,19 +197,50 @@ k_apply: usize,

sigma: f64, rank: usize, ) where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEKeyswitchFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + VecZnxAutomorphism + VecZnxSwithcDegree + VecZnxAddScalarInplace + VecZnxAutomorphism + VecZnxAutomorphismInplace - + GLWEDecryptFamily<B> + + VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + VecZnxSubScalarInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B>, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>
M core/src/tests/generics/automorphism/ggsw_ct.rs → core/src/tests/generics/automorphism/ggsw_ct.rs

@@ -1,7 +1,12 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxCopy, - VecZnxSubABInplace, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, + VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAlloc, VecZnxBigAllocBytes, VecZnxBigNormalize, + VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAddInplace, VecZnxDftAlloc, VecZnxDftAllocBytes, VecZnxDftCopy, + VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, VmpApply, + VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScalarZnx, ScratchOwned}, oep::{

@@ -17,11 +22,6 @@ GGLWEAutomorphismKey, GGLWETensorKey, GGSWCiphertext, GLWESecret,

prepared::{GGLWEAutomorphismKeyPrepared, GGLWETensorKeyPrepared, GLWESecretPrepared, Prepare, PrepareAlloc}, }, noise::noise_ggsw_keyswitch, - trait_families::GGSWAssertNoiseFamily, -}; - -use crate::trait_families::{ - GGLWESwitchingKeyEncryptSkFamily, GGLWETensorKeyEncryptSkFamily, GGSWKeySwitchFamily, GLWESecretPreparedModuleFamily, }; pub fn test_ggsw_automorphism<B: Backend>(

@@ -36,23 +36,44 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GGSWAssertNoiseFamily<B> - + GLWESecretPreparedModuleFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpA<B> + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + VecZnxAddScalarInplace + VecZnxCopy + VecZnxSubABInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGSWKeySwitchFamily<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GGLWETensorKeyEncryptSkFamily<B> + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftCopy<B> + + VecZnxDftAddInplace<B> + + VecZnxFillUniform + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpApply<B> + VecZnxSwithcDegree - + VecZnxAutomorphismInplace + VecZnxAutomorphismInplace + VecZnxAutomorphism, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>

@@ -171,23 +192,45 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GGSWAssertNoiseFamily<B> - + GLWESecretPreparedModuleFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpA<B> + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + VecZnxAddScalarInplace + VecZnxCopy + VecZnxSubABInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGSWKeySwitchFamily<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GGLWETensorKeyEncryptSkFamily<B> + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxDftCopy<B> + + VecZnxDftAddInplace<B> + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + VecZnxFillUniform + + SvpApply<B> + VecZnxSwithcDegree + VecZnxAutomorphismInplace - + VecZnxAutomorphismInplace + VecZnxAutomorphism, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>
M core/src/tests/generics/automorphism/glwe_ct.rs → core/src/tests/generics/automorphism/glwe_ct.rs

@@ -1,7 +1,11 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, - VecZnxFillUniform, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxBigAddInplace, + VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAllocBytes, + VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, + VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, + VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -17,11 +21,8 @@ GGLWEAutomorphismKey, GLWECiphertext, GLWEPlaintext, GLWESecret, Infos,

prepared::{GGLWEAutomorphismKeyPrepared, GLWESecretPrepared, Prepare, PrepareAlloc}, }, noise::log2_std_noise_gglwe_product, - trait_families::{GLWEDecryptFamily, GLWEKeyswitchFamily}, }; -use crate::trait_families::{GGLWEAutomorphismKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - pub fn test_glwe_automorphism<B: Backend>( module: &Module<B>, basek: usize,

@@ -33,16 +34,35 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> - + GLWEKeyswitchFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + VecZnxAutomorphism + VecZnxSwithcDegree + VecZnxAddScalarInplace + VecZnxAutomorphismInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -140,16 +160,35 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> - + GLWEKeyswitchFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + VecZnxAutomorphism + VecZnxSwithcDegree + VecZnxAddScalarInplace + VecZnxAutomorphismInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>
M core/src/tests/generics/conversion.rs → core/src/tests/generics/conversion.rs

@@ -1,7 +1,11 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, VecZnxSwithcDegree, - VmpPMatAlloc, VmpPMatPrepare, ZnxView, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, + VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, + ZnxView, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -17,27 +21,44 @@ LWEToGLWESwitchingKey,

prepared::{GLWESecretPrepared, GLWEToLWESwitchingKeyPrepared, LWEToGLWESwitchingKeyPrepared, PrepareAlloc}, }; -use crate::trait_families::{GGLWEEncryptSkFamily, GLWEDecryptFamily, GLWEKeyswitchFamily, GLWESecretPreparedModuleFamily}; - pub fn test_lwe_to_glwe<B: Backend>(module: &Module<B>) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace - + GLWEKeyswitchFamily<B> - + VecZnxAutomorphismInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GLWESecretPreparedModuleFamily<B>, - B: TakeScalarZnxImpl<B> - + TakeVecZnxDftImpl<B> - + ScratchAvailableImpl<B> - + TakeVecZnxImpl<B> + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxAutomorphismInplace, + B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> - + ScratchOwnedBorrowImpl<B>, + + ScratchOwnedBorrowImpl<B> + + ScratchAvailableImpl<B> + + TakeScalarZnxImpl<B> + + TakeVecZnxImpl<B>, { let n: usize = module.n(); let basek: usize = 17;

@@ -112,23 +133,42 @@ }

pub fn test_glwe_to_lwe<B: Backend>(module: &Module<B>) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace - + GLWEKeyswitchFamily<B> - + VecZnxAutomorphismInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GLWESecretPreparedModuleFamily<B>, - B: TakeScalarZnxImpl<B> - + TakeVecZnxDftImpl<B> - + ScratchAvailableImpl<B> - + TakeVecZnxImpl<B> + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxAutomorphismInplace, + B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> - + ScratchOwnedBorrowImpl<B>, + + ScratchOwnedBorrowImpl<B> + + ScratchAvailableImpl<B> + + TakeScalarZnxImpl<B> + + TakeVecZnxImpl<B>, { let n: usize = module.n(); let basek: usize = 17;
M core/src/tests/generics/encryption/gglwe_atk.rs → core/src/tests/generics/encryption/gglwe_atk.rs

@@ -1,7 +1,11 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxCopy, - VecZnxSubScalarInplace, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxBigAddInplace, + VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxCopy, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSubScalarInplace, + VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -11,16 +15,11 @@ },

}; use sampling::source::Source; -use crate::{ - layouts::{ - GGLWEAutomorphismKey, GLWESecret, - compressed::GGLWEAutomorphismKeyCompressed, - prepared::{GLWESecretPrepared, PrepareAlloc}, - }, - trait_families::{Decompress, GLWEDecryptFamily, GLWEKeyswitchFamily}, +use crate::layouts::{ + GGLWEAutomorphismKey, GLWESecret, + compressed::{Decompress, GGLWEAutomorphismKeyCompressed}, + prepared::{GLWESecretPrepared, PrepareAlloc}, }; - -use crate::trait_families::{GGLWEAutomorphismKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; pub fn test_gglwe_automorphisk_key_encrypt_sk<B: Backend>( module: &Module<B>,

@@ -30,19 +29,37 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEKeyswitchFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigAddSmallInplace<B> + VecZnxAutomorphism + VecZnxSwithcDegree + VecZnxAddScalarInplace - + VecZnxAutomorphism + VecZnxAutomorphismInplace - + GLWEDecryptFamily<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + VecZnxSubScalarInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B>, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>

@@ -105,19 +122,37 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GGLWEAutomorphismKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEKeyswitchFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigAddSmallInplace<B> + VecZnxAutomorphism + VecZnxSwithcDegree + VecZnxAddScalarInplace - + VecZnxAutomorphism + VecZnxAutomorphismInplace - + GLWEDecryptFamily<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + VecZnxSubScalarInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B>, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>
M core/src/tests/generics/encryption/gglwe_ct.rs → core/src/tests/generics/encryption/gglwe_ct.rs

@@ -1,7 +1,10 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxCopy, VecZnxSubScalarInplace, VecZnxSwithcDegree, - VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, + VecZnxBigNormalize, VecZnxCopy, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSubScalarInplace, + VecZnxSwithcDegree, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -11,17 +14,12 @@ },

}; use sampling::source::Source; -use crate::{ - layouts::{ - GGLWESwitchingKey, GLWESecret, - compressed::GGLWESwitchingKeyCompressed, - prepared::{GLWESecretPrepared, PrepareAlloc}, - }, - trait_families::{Decompress, GLWEDecryptFamily}, +use crate::layouts::{ + GGLWESwitchingKey, GLWESecret, + compressed::{Decompress, GGLWESwitchingKeyCompressed}, + prepared::{GLWESecretPrepared, PrepareAlloc}, }; -use crate::trait_families::{GGLWEEncryptSkFamily, GLWESecretPreparedModuleFamily}; - pub fn test_gglwe_switching_key_encrypt_sk<B: Backend>( module: &Module<B>, basek: usize,

@@ -31,18 +29,33 @@ rank_in: usize,

rank_out: usize, sigma: f64, ) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAddSmallInplace<B> + VecZnxSwithcDegree + VecZnxAddScalarInplace + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + VecZnxSubScalarInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>

@@ -95,18 +108,33 @@ rank_in: usize,

rank_out: usize, sigma: f64, ) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAddSmallInplace<B> + VecZnxSwithcDegree + VecZnxAddScalarInplace + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + VecZnxSubScalarInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>
M core/src/tests/generics/encryption/ggsw_ct.rs → core/src/tests/generics/encryption/ggsw_ct.rs

@@ -1,7 +1,10 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxCopy, VecZnxSubABInplace, VmpPMatAlloc, - VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAlloc, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAlloc, VecZnxDftAllocBytes, + VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScalarZnx, ScratchOwned}, oep::{

@@ -11,27 +14,41 @@ },

}; use sampling::source::Source; -use crate::{ - layouts::{ - GGSWCiphertext, GLWESecret, - compressed::GGSWCiphertextCompressed, - prepared::{GLWESecretPrepared, PrepareAlloc}, - }, - trait_families::{Decompress, GGSWAssertNoiseFamily}, +use crate::layouts::{ + GGSWCiphertext, GLWESecret, + compressed::{Decompress, GGSWCiphertextCompressed}, + prepared::{GLWESecretPrepared, PrepareAlloc}, }; - -use crate::trait_families::{GGSWEncryptSkFamily, GLWESecretPreparedModuleFamily}; pub fn test_ggsw_encrypt_sk<B: Backend>(module: &Module<B>, basek: usize, k: usize, digits: usize, rank: usize, sigma: f64) where - Module<B>: GLWESecretPreparedModuleFamily<B> - + GGSWEncryptSkFamily<B> - + GGSWAssertNoiseFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAddSmallInplace<B> + VecZnxAddScalarInplace - + VecZnxSubABInplace + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B> + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpA<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -88,17 +105,35 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GLWESecretPreparedModuleFamily<B> - + GGSWEncryptSkFamily<B> - + GGSWAssertNoiseFamily<B> - + VecZnxAddScalarInplace + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxAddScalarInplace + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B> + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpA<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>
M core/src/tests/generics/encryption/glwe_ct.rs → core/src/tests/generics/encryption/glwe_ct.rs

@@ -1,5 +1,11 @@

use backend::hal::{ - api::{ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxCopy, VecZnxDftAlloc, VecZnxFillUniform, VecZnxSubABInplace}, + api::{ + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, + VecZnxAddInplace, VecZnxAddNormal, VecZnxBigAddInplace, VecZnxBigAddNormal, VecZnxBigAddSmallInplace, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxCopy, VecZnxDftAlloc, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, + VecZnxSub, VecZnxSubABInplace, + }, layouts::{Backend, Module, ScratchOwned}, oep::{ ScratchAvailableImpl, ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeScalarZnxImpl, TakeSvpPPolImpl,

@@ -11,21 +17,49 @@

use crate::{ layouts::{ GLWECiphertext, GLWEPlaintext, GLWEPublicKey, GLWESecret, Infos, - compressed::GLWECiphertextCompressed, + compressed::{Decompress, GLWECiphertextCompressed}, prepared::{GLWEPublicKeyPrepared, GLWESecretPrepared, PrepareAlloc}, }, operations::GLWEOperations, - trait_families::Decompress, }; -use crate::trait_families::{GLWEDecryptFamily, GLWEEncryptPkFamily, GLWEEncryptSkFamily, GLWESecretPreparedModuleFamily}; - -pub trait EncryptionTestModuleFamily<B: Backend> = - GLWEDecryptFamily<B> + GLWESecretPreparedModuleFamily<B> + GLWEEncryptPkFamily<B>; - pub fn test_glwe_encrypt_sk<B: Backend>(module: &Module<B>, basek: usize, k_ct: usize, k_pt: usize, sigma: f64, rank: usize) where - Module<B>: EncryptionTestModuleFamily<B> + GLWEEncryptSkFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + SvpPPolAllocBytes + + SvpPrepare<B> + + SvpApply<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddNormal<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -83,7 +117,42 @@ k_pt: usize,

sigma: f64, rank: usize, ) where - Module<B>: EncryptionTestModuleFamily<B> + GLWEEncryptSkFamily<B> + VecZnxCopy, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + SvpPPolAllocBytes + + SvpPrepare<B> + + SvpApply<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddNormal<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + VecZnxCopy, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -146,7 +215,41 @@ }

pub fn test_glwe_encrypt_zero_sk<B: Backend>(module: &Module<B>, basek: usize, k_ct: usize, sigma: f64, rank: usize) where - Module<B>: EncryptionTestModuleFamily<B> + GLWEEncryptSkFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxDftAllocBytes + + VecZnxBigAllocBytes + + SvpPPolAllocBytes + + SvpPrepare<B> + + SvpApply<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddNormal<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -189,8 +292,29 @@ }

pub fn test_glwe_encrypt_pk<B: Backend>(module: &Module<B>, basek: usize, k_ct: usize, k_pk: usize, sigma: f64, rank: usize) where - Module<B>: - EncryptionTestModuleFamily<B> + GLWEEncryptSkFamily<B> + VecZnxDftAlloc<B> + VecZnxFillUniform + VecZnxSubABInplace, + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxCopy + + VecZnxDftAlloc<B> + + SvpApply<B> + + VecZnxBigAddNormal<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>
M core/src/tests/generics/encryption/glwe_tsk.rs → core/src/tests/generics/encryption/glwe_tsk.rs

@@ -1,7 +1,10 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxBigAlloc, VecZnxCopy, VecZnxDftAlloc, - VecZnxSubScalarInplace, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAlloc, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxCopy, VecZnxDftAlloc, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, + VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VecZnxSubScalarInplace, VecZnxSwithcDegree, }, layouts::{Backend, Module, ScratchOwned, VecZnxDft}, oep::{

@@ -11,34 +14,43 @@ },

}; use sampling::source::Source; -use crate::{ - layouts::{ - GGLWETensorKey, GLWEPlaintext, GLWESecret, Infos, - compressed::GGLWETensorKeyCompressed, - prepared::{GLWESecretPrepared, PrepareAlloc}, - }, - trait_families::{Decompress, GLWEDecryptFamily}, +use crate::layouts::{ + GGLWETensorKey, GLWEPlaintext, GLWESecret, Infos, + compressed::{Decompress, GGLWETensorKeyCompressed}, + prepared::{GLWESecretPrepared, PrepareAlloc}, }; -use crate::trait_families::{GGLWEEncryptSkFamily, GGLWETensorKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - pub fn test_glwe_tensor_key_encrypt_sk<B: Backend>(module: &Module<B>, basek: usize, k: usize, sigma: f64, rank: usize) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree - + VecZnxAddScalarInplace - + VecZnxSubScalarInplace - + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGLWETensorKeyEncryptSkFamily<B> - + GLWEDecryptFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxCopy + VecZnxDftAlloc<B> - + VecZnxBigAlloc<B>, + + SvpApply<B> + + VecZnxBigAlloc<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxAddScalarInplace + + VecZnxSwithcDegree + + VecZnxSubScalarInplace, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>

@@ -120,22 +132,35 @@ }

pub fn test_glwe_tensor_key_compressed_encrypt_sk<B: Backend>(module: &Module<B>, basek: usize, k: usize, sigma: f64, rank: usize) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree - + VecZnxAddScalarInplace - + VecZnxSubScalarInplace - + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGLWETensorKeyEncryptSkFamily<B> - + GLWEDecryptFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxCopy + VecZnxDftAlloc<B> + + SvpApply<B> + VecZnxBigAlloc<B> - + VecZnxCopy, + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxAddScalarInplace + + VecZnxSwithcDegree + + VecZnxSubScalarInplace, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>
M core/src/tests/generics/external_product/gglwe_ksk.rs → core/src/tests/generics/external_product/gglwe_ksk.rs

@@ -1,7 +1,11 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxCopy, VecZnxRotateInplace, VecZnxSubScalarInplace, - VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, ZnxViewMut, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, + VecZnxBigNormalize, VecZnxCopy, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotateInplace, VecZnxSub, VecZnxSubABInplace, + VecZnxSubScalarInplace, VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, + ZnxViewMut, }, layouts::{Backend, Module, ScalarZnx, ScalarZnxToMut, ScratchOwned}, oep::{

@@ -17,10 +21,7 @@ GGLWESwitchingKey, GGSWCiphertext, GLWESecret,

prepared::{GGSWCiphertextPrepared, GLWESecretPrepared, PrepareAlloc}, }, noise::noise_ggsw_product, - trait_families::{GLWEDecryptFamily, GLWEExternalProductFamily}, }; - -use crate::trait_families::{GGLWEEncryptSkFamily, GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; pub fn test_gglwe_switching_key_external_product<B: Backend>( module: &Module<B>,

@@ -33,22 +34,37 @@ rank_in: usize,

rank_out: usize, sigma: f64, ) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + VecZnxSwithcDegree + VecZnxAddScalarInplace + VecZnxSubScalarInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GLWEExternalProductFamily<B> - + GLWEDecryptFamily<B> - + VecZnxRotateInplace, + + VecZnxRotateInplace + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VmpPrepare<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>

@@ -159,22 +175,37 @@ rank_in: usize,

rank_out: usize, sigma: f64, ) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + VecZnxSwithcDegree + VecZnxAddScalarInplace + VecZnxSubScalarInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GLWEExternalProductFamily<B> - + GLWEDecryptFamily<B> - + VecZnxRotateInplace, + + VecZnxRotateInplace + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VmpPrepare<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>
M core/src/tests/generics/external_product/ggsw_ct.rs → core/src/tests/generics/external_product/ggsw_ct.rs

@@ -1,7 +1,11 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxCopy, VecZnxRotateInplace, VecZnxSubABInplace, - VmpPMatAlloc, VmpPMatPrepare, ZnxViewMut, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAlloc, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAlloc, VecZnxDftAllocBytes, + VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, VecZnxFillUniform, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotateInplace, VecZnxSub, VecZnxSubABInplace, VmpApply, + VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, ZnxViewMut, }, layouts::{Backend, Module, ScalarZnx, ScalarZnxToMut, ScratchOwned}, oep::{

@@ -17,12 +21,6 @@ GGSWCiphertext, GLWESecret,

prepared::{GGSWCiphertextPrepared, GLWESecretPrepared, PrepareAlloc}, }, noise::noise_ggsw_product, - trait_families::GGSWAssertNoiseFamily, -}; - -use crate::trait_families::{ - GGLWESwitchingKeyEncryptSkFamily, GGLWETensorKeyEncryptSkFamily, GGSWEncryptSkFamily, GGSWKeySwitchFamily, - GLWESecretPreparedModuleFamily, }; pub fn test_ggsw_external_product<B: Backend>(

@@ -35,22 +33,39 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GLWESecretPreparedModuleFamily<B> - + GGSWEncryptSkFamily<B> - + GGSWAssertNoiseFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + VecZnxAddScalarInplace - + VecZnxSubABInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGSWAssertNoiseFamily<B> - + GGSWKeySwitchFamily<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GGLWETensorKeyEncryptSkFamily<B> - + VecZnxRotateInplace, + + VecZnxRotateInplace + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VmpPrepare<B> + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpA<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>

@@ -151,22 +166,39 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GLWESecretPreparedModuleFamily<B> - + GGSWEncryptSkFamily<B> - + GGSWAssertNoiseFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + VecZnxAddScalarInplace - + VecZnxSubABInplace + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGSWAssertNoiseFamily<B> - + GGSWKeySwitchFamily<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GGLWETensorKeyEncryptSkFamily<B> - + VecZnxRotateInplace, + + VecZnxRotateInplace + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VmpPrepare<B> + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpA<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B>
M core/src/tests/generics/external_product/glwe_ct.rs → core/src/tests/generics/external_product/glwe_ct.rs

@@ -1,7 +1,10 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxFillUniform, VecZnxRotateInplace, VmpPMatAlloc, - VmpPMatPrepare, ZnxViewMut, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotateInplace, VecZnxSub, VecZnxSubABInplace, + VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, ZnxViewMut, }, layouts::{Backend, Module, ScalarZnx, ScratchOwned}, oep::{

@@ -19,8 +22,6 @@ },

noise::noise_ggsw_product, }; -use crate::trait_families::{GLWEDecryptFamily, GLWEEncryptSkFamily, GLWEExternalProductFamily, GLWESecretPreparedModuleFamily}; - pub fn test_glwe_external_product<B: Backend>( module: &Module<B>, basek: usize,

@@ -31,14 +32,32 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> - + GLWEExternalProductFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace + VecZnxRotateInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -148,14 +167,32 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> - + GLWEExternalProductFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace + VecZnxRotateInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>
M core/src/tests/generics/keyswitch/gglwe_ct.rs → core/src/tests/generics/keyswitch/gglwe_ct.rs

@@ -1,12 +1,15 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxCopy, VecZnxSubScalarInplace, VecZnxSwithcDegree, - VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, + VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, + VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + VecZnxSubScalarInplace, VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScratchOwned}, oep::{ ScratchAvailableImpl, ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeScalarZnxImpl, TakeSvpPPolImpl, - TakeVecZnxBigImpl, TakeVecZnxDftImpl, TakeVecZnxImpl, VecZnxBigAllocBytesImpl, VecZnxDftAllocBytesImpl, + TakeVecZnxBigImpl, TakeVecZnxDftImpl, TakeVecZnxImpl, }, }; use sampling::source::Source;

@@ -17,11 +20,8 @@ GGLWESwitchingKey, GLWESecret,

prepared::{GGLWESwitchingKeyPrepared, GLWESecretPrepared, PrepareAlloc}, }, noise::log2_std_noise_gglwe_product, - trait_families::{GLWEDecryptFamily, GLWEKeyswitchFamily}, }; -use crate::trait_families::{GGLWEEncryptSkFamily, GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - pub fn test_gglwe_switching_key_keyswitch<B: Backend>( module: &Module<B>, basek: usize,

@@ -34,18 +34,34 @@ rank_out_s0s1: usize,

rank_out_s1s2: usize, sigma: f64, ) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace - + VecZnxSubScalarInplace - + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGLWEEncryptSkFamily<B> - + GLWEDecryptFamily<B> - + GLWEKeyswitchFamily<B>, + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxSubScalarInplace, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -53,10 +69,7 @@ + ScratchOwnedAllocImpl<B>

+ ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B> + TakeScalarZnxImpl<B> - + TakeVecZnxImpl<B> - + VecZnxDftAllocBytesImpl<B> - + VecZnxBigAllocBytesImpl<B> - + TakeSvpPPolImpl<B>, + + TakeVecZnxImpl<B>, { let n: usize = module.n(); let rows: usize = k_in.div_ceil(basek * digits);

@@ -171,18 +184,34 @@ rank_in: usize,

rank_out: usize, sigma: f64, ) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace - + VecZnxSubScalarInplace - + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GLWEKeyswitchFamily<B> - + GLWEDecryptFamily<B>, + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxSubScalarInplace, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -190,10 +219,7 @@ + ScratchOwnedAllocImpl<B>

+ ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B> + TakeScalarZnxImpl<B> - + TakeVecZnxImpl<B> - + VecZnxDftAllocBytesImpl<B> - + VecZnxBigAllocBytesImpl<B> - + TakeSvpPPolImpl<B>, + + TakeVecZnxImpl<B>, { let n: usize = module.n(); let rows: usize = k_ct.div_ceil(basek * digits);
M core/src/tests/generics/keyswitch/ggsw_ct.rs → core/src/tests/generics/keyswitch/ggsw_ct.rs

@@ -1,12 +1,16 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxCopy, VecZnxSubABInplace, VecZnxSwithcDegree, - VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAlloc, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAddInplace, VecZnxDftAlloc, + VecZnxDftAllocBytes, VecZnxDftCopy, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, + VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScalarZnx, ScratchOwned}, oep::{ ScratchAvailableImpl, ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeScalarZnxImpl, TakeSvpPPolImpl, - TakeVecZnxBigImpl, TakeVecZnxDftImpl, TakeVecZnxImpl, VecZnxBigAllocBytesImpl, VecZnxDftAllocBytesImpl, + TakeVecZnxBigImpl, TakeVecZnxDftImpl, TakeVecZnxImpl, }, }; use sampling::source::Source;

@@ -17,12 +21,6 @@ GGLWESwitchingKey, GGLWETensorKey, GGSWCiphertext, GLWESecret,

prepared::{GGLWESwitchingKeyPrepared, GGLWETensorKeyPrepared, GLWESecretPrepared, PrepareAlloc}, }, noise::noise_ggsw_keyswitch, - trait_families::GGSWAssertNoiseFamily, -}; - -use crate::trait_families::{ - GGLWESwitchingKeyEncryptSkFamily, GGLWETensorKeyEncryptSkFamily, GGSWEncryptSkFamily, GGSWKeySwitchFamily, - GLWESecretPreparedModuleFamily, }; pub fn test_ggsw_keyswitch<B: Backend>(

@@ -36,19 +34,39 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GLWESecretPreparedModuleFamily<B> - + GGSWEncryptSkFamily<B> - + GGSWAssertNoiseFamily<B> + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace - + VecZnxSubABInplace - + VecZnxCopy + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGSWAssertNoiseFamily<B> - + GGSWKeySwitchFamily<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GGLWETensorKeyEncryptSkFamily<B> - + VecZnxSwithcDegree, + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + SvpApply<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxDftCopy<B> + + VecZnxDftAddInplace<B> + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -56,13 +74,7 @@ + ScratchOwnedAllocImpl<B>

+ ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B> + TakeScalarZnxImpl<B> - + TakeVecZnxImpl<B> - + VecZnxDftAllocBytesImpl<B> - + VecZnxBigAllocBytesImpl<B> - + TakeSvpPPolImpl<B> - + VecZnxDftAllocBytesImpl<B> - + VecZnxBigAllocBytesImpl<B> - + TakeSvpPPolImpl<B>, + + TakeVecZnxImpl<B>, { let n: usize = module.n(); let rows: usize = k_in.div_ceil(digits * basek);

@@ -168,19 +180,39 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GLWESecretPreparedModuleFamily<B> - + GGSWEncryptSkFamily<B> - + GGSWAssertNoiseFamily<B> - + VecZnxAddScalarInplace + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + VecZnxSubABInplace - + VecZnxCopy + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + + VecZnxAddScalarInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GGSWAssertNoiseFamily<B> - + GGSWKeySwitchFamily<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GGLWETensorKeyEncryptSkFamily<B> - + VecZnxSwithcDegree, + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + SvpApply<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxDftCopy<B> + + VecZnxDftAddInplace<B> + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B>, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -188,10 +220,7 @@ + ScratchOwnedAllocImpl<B>

+ ScratchOwnedBorrowImpl<B> + ScratchAvailableImpl<B> + TakeScalarZnxImpl<B> - + TakeVecZnxImpl<B> - + VecZnxDftAllocBytesImpl<B> - + VecZnxBigAllocBytesImpl<B> - + TakeSvpPPolImpl<B>, + + TakeVecZnxImpl<B>, { let n: usize = module.n(); let rows: usize = k_ct.div_ceil(digits * basek);
M core/src/tests/generics/keyswitch/glwe_ct.rs → core/src/tests/generics/keyswitch/glwe_ct.rs

@@ -1,7 +1,10 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxFillUniform, VecZnxSwithcDegree, VmpPMatAlloc, - VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, + VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, + VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -17,11 +20,8 @@ GGLWESwitchingKey, GLWECiphertext, GLWEPlaintext, GLWESecret, Infos,

prepared::{GGLWESwitchingKeyPrepared, GLWESecretPrepared, PrepareAlloc}, }, noise::log2_std_noise_gglwe_product, - trait_families::{GLWEDecryptFamily, GLWEKeyswitchFamily}, }; -use crate::trait_families::{GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - pub fn test_glwe_keyswitch<B: Backend>( module: &Module<B>, basek: usize,

@@ -33,14 +33,33 @@ rank_in: usize,

rank_out: usize, sigma: f64, ) where - Module<B>: GGLWESwitchingKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEKeyswitchFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>

@@ -137,14 +156,33 @@ digits: usize,

rank: usize, sigma: f64, ) where - Module<B>: GGLWESwitchingKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEKeyswitchFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree, B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B>
M core/src/tests/generics/keyswitch/lwe_ct.rs → core/src/tests/generics/keyswitch/lwe_ct.rs

@@ -1,7 +1,11 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, VecZnxSwithcDegree, - VmpPMatAlloc, VmpPMatPrepare, ZnxView, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphismInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, + VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, + ZnxView, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -16,27 +20,44 @@ Infos, LWECiphertext, LWEPlaintext, LWESecret, LWESwitchingKey,

prepared::{LWESwitchingKeyPrepared, PrepareAlloc}, }; -use crate::trait_families::{GGLWEEncryptSkFamily, GLWEDecryptFamily, GLWEKeyswitchFamily, GLWESecretPreparedModuleFamily}; - pub fn test_lwe_keyswitch<B: Backend>(module: &Module<B>) where - Module<B>: GGLWEEncryptSkFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree + Module<B>: VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + VecZnxAddScalarInplace - + GLWEKeyswitchFamily<B> - + VecZnxAutomorphismInplace + VmpPMatAlloc<B> - + VmpPMatPrepare<B> - + GLWESecretPreparedModuleFamily<B>, - B: TakeScalarZnxImpl<B> - + TakeVecZnxDftImpl<B> - + ScratchAvailableImpl<B> - + TakeVecZnxImpl<B> + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxAutomorphismInplace, + B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + TakeSvpPPolImpl<B> + ScratchOwnedAllocImpl<B> - + ScratchOwnedBorrowImpl<B>, + + ScratchOwnedBorrowImpl<B> + + ScratchAvailableImpl<B> + + TakeScalarZnxImpl<B> + + TakeVecZnxImpl<B>, { let n: usize = module.n(); let basek: usize = 17;
M core/src/tests/generics/packing.rs → core/src/tests/generics/packing.rs

@@ -2,8 +2,13 @@ use std::collections::HashMap;

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxBigSubSmallBInplace, - VecZnxRotateInplace, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxBigAddInplace, + VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, VecZnxBigAutomorphismInplace, VecZnxBigNormalize, + VecZnxBigNormalizeTmpBytes, VecZnxBigSubSmallBInplace, VecZnxCopy, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNegateInplace, VecZnxNormalize, VecZnxNormalizeInplace, + VecZnxNormalizeTmpBytes, VecZnxRotate, VecZnxRotateInplace, VecZnxRshInplace, VecZnxSub, VecZnxSubABInplace, + VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -19,37 +24,54 @@ layouts::{

GGLWEAutomorphismKey, GLWECiphertext, GLWEPlaintext, GLWESecret, prepared::{GGLWEAutomorphismKeyPrepared, GLWESecretPrepared, PrepareAlloc}, }, - trait_families::{GLWEDecryptFamily, GLWEKeyswitchFamily, GLWEPackingFamily}, }; -use crate::trait_families::{GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - -pub trait PackingTestModuleFamily<B: Backend> = GLWEPackingFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GGLWESwitchingKeyEncryptSkFamily<B> - + GLWEKeyswitchFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree - + VecZnxAddScalarInplace - + VecZnxRotateInplace - + VecZnxAutomorphism - + VecZnxBigSubSmallBInplace<B> - + VmpPMatAlloc<B> - + VmpPMatPrepare<B>; - -pub trait PackingTestScratchFamily<B: Backend> = TakeVecZnxDftImpl<B> - + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> - + ScratchOwnedAllocImpl<B> - + ScratchOwnedBorrowImpl<B> - + ScratchAvailableImpl<B> - + TakeScalarZnxImpl<B> - + TakeVecZnxImpl<B>; - pub fn test_glwe_packing<B: Backend>(module: &Module<B>) where - Module<B>: PackingTestModuleFamily<B>, - B: PackingTestScratchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxAutomorphism + + VecZnxBigAutomorphismInplace<B> + + VecZnxBigSubSmallBInplace<B> + + VecZnxNegateInplace + + VecZnxRshInplace + + VecZnxRotateInplace + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + VecZnxRotate + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + + VecZnxAddScalarInplace + + VmpPMatAlloc<B> + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxAutomorphismInplace + + VecZnxCopy, + B: TakeVecZnxDftImpl<B> + + TakeVecZnxBigImpl<B> + + TakeSvpPPolImpl<B> + + ScratchOwnedAllocImpl<B> + + ScratchOwnedBorrowImpl<B> + + ScratchAvailableImpl<B> + + TakeScalarZnxImpl<B> + + TakeVecZnxImpl<B>, { let mut source_xs: Source = Source::new([0u8; 32]); let mut source_xe: Source = Source::new([0u8; 32]);
M core/src/tests/generics/trace.rs → core/src/tests/generics/trace.rs

@@ -2,9 +2,13 @@ use std::collections::HashMap;

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxBigAutomorphismInplace, - VecZnxBigSubSmallBInplace, VecZnxCopy, VecZnxFillUniform, VecZnxNormalizeInplace, VecZnxRotateInplace, VecZnxRshInplace, - VecZnxSubABInplace, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, ZnxView, ZnxViewMut, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, + VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, + VecZnxBigAllocBytes, VecZnxBigAutomorphismInplace, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, + VecZnxBigSubSmallBInplace, VecZnxCopy, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, + VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotateInplace, + VecZnxRshInplace, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, + VmpPMatAlloc, VmpPrepare, ZnxView, ZnxViewMut, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -20,39 +24,51 @@ GGLWEAutomorphismKey, GLWECiphertext, GLWEPlaintext, GLWESecret, Infos,

prepared::{GGLWEAutomorphismKeyPrepared, GLWESecretPrepared, PrepareAlloc}, }, noise::var_noise_gglwe_product, - trait_families::{GLWEDecryptFamily, GLWEKeyswitchFamily}, }; -use crate::trait_families::{GGLWESwitchingKeyEncryptSkFamily, GLWESecretPreparedModuleFamily}; - -pub trait TraceTestModuleFamily<B: Backend> = GGLWESwitchingKeyEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEKeyswitchFamily<B> - + GLWEDecryptFamily<B> - + VecZnxSwithcDegree - + VecZnxAddScalarInplace - + VecZnxRotateInplace - + VecZnxBigSubSmallBInplace<B> - + VecZnxBigAutomorphismInplace<B> - + VecZnxCopy - + VecZnxAutomorphism - + VecZnxRshInplace - + VmpPMatAlloc<B> - + VmpPMatPrepare<B>; - -pub trait TraceTestScratchFamily<B: Backend> = TakeVecZnxDftImpl<B> - + TakeVecZnxBigImpl<B> - + TakeSvpPPolImpl<B> - + ScratchOwnedAllocImpl<B> - + ScratchOwnedBorrowImpl<B> - + ScratchAvailableImpl<B> - + TakeScalarZnxImpl<B> - + TakeVecZnxImpl<B>; - pub fn test_glwe_trace_inplace<B: Backend>(module: &Module<B>, basek: usize, k: usize, sigma: f64, rank: usize) where - Module<B>: TraceTestModuleFamily<B>, - B: TraceTestScratchFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VecZnxAutomorphism + + VecZnxBigAutomorphismInplace<B> + + VecZnxBigSubSmallBInplace<B> + + VecZnxRshInplace + + VecZnxRotateInplace + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxBigAllocBytes + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxNormalizeTmpBytes + + VecZnxAddScalarInplace + + VmpPMatAlloc<B> + + VmpPrepare<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxBigNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxCopy, + B: TakeVecZnxDftImpl<B> + + TakeVecZnxBigImpl<B> + + TakeSvpPPolImpl<B> + + ScratchOwnedAllocImpl<B> + + ScratchOwnedBorrowImpl<B> + + ScratchAvailableImpl<B> + + TakeScalarZnxImpl<B> + + TakeVecZnxImpl<B>, { let n: usize = module.n(); let k_autokey: usize = k + basek;
D core/src/trait_families.rs

@@ -1,104 +0,0 @@

-use backend::hal::{ - api::{ - ScratchAvailable, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, TakeVecZnxDft, - VecZnxAddInplace, VecZnxAddNormal, VecZnxAutomorphismInplace, VecZnxBigAddInplace, VecZnxBigAddNormal, - VecZnxBigAddSmallInplace, VecZnxBigAlloc, VecZnxBigAllocBytes, VecZnxBigAutomorphismInplace, VecZnxBigNormalize, - VecZnxBigNormalizeTmpBytes, VecZnxBigSubSmallBInplace, VecZnxCopy, VecZnxDftAddInplace, VecZnxDftAlloc, - VecZnxDftAllocBytes, VecZnxDftCopy, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, - VecZnxFillUniform, VecZnxNegateInplace, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotate, - VecZnxRotateInplace, VecZnxRshInplace, VecZnxSub, VecZnxSubABInplace, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, - VmpPMatAlloc, VmpPMatAllocBytes, VmpPMatPrepare, - }, - layouts::{Backend, Module}, -}; - -pub trait GGSWKeySwitchFamily<B> = - GLWEKeyswitchFamily<B> + VecZnxBigAllocBytes + VecZnxDftCopy<B> + VecZnxDftAddInplace<B> + VecZnxDftToVecZnxBigTmpA<B>; -pub trait GGLWEEncryptSkFamily<B: Backend> = GLWEEncryptSkFamily<B>; -pub trait GGLWESwitchingKeyEncryptSkFamily<B: Backend> = GGLWEEncryptSkFamily<B>; -pub trait GGLWEAutomorphismKeyEncryptSkFamily<B: Backend> = GGLWEEncryptSkFamily<B>; -pub trait GGLWETensorKeyEncryptSkFamily<B: Backend> = - GGLWEEncryptSkFamily<B> + VecZnxBigAllocBytes + VecZnxDftToVecZnxBigTmpA<B> + SvpApply<B>; -pub trait GGSWEncryptSkFamily<B: Backend> = GLWEEncryptSkFamily<B>; -pub trait GGSWAssertNoiseFamily<B: Backend> = GLWEDecryptFamily<B> - + VecZnxBigAlloc<B> - + VecZnxDftAlloc<B> - + VecZnxBigNormalizeTmpBytes - + VecZnxBigNormalize<B> - + VecZnxDftToVecZnxBigTmpA<B>; -pub trait GLWEDecryptFamily<B: Backend> = VecZnxDftAllocBytes - + VecZnxBigAllocBytes - + VecZnxDftFromVecZnx<B> - + SvpApplyInplace<B> - + VecZnxDftToVecZnxBigConsume<B> - + VecZnxBigAddInplace<B> - + VecZnxBigAddSmallInplace<B> - + VecZnxBigNormalize<B> - + VecZnxNormalizeTmpBytes; -pub trait GLWEEncryptSkFamily<B: Backend> = VecZnxDftAllocBytes - + VecZnxBigNormalize<B> - + VecZnxDftFromVecZnx<B> - + SvpApplyInplace<B> - + VecZnxDftToVecZnxBigConsume<B> - + VecZnxNormalizeTmpBytes - + VecZnxFillUniform - + VecZnxSubABInplace - + VecZnxAddInplace - + VecZnxNormalizeInplace<B> - + VecZnxAddNormal - + VecZnxNormalize<B> - + VecZnxSub; -pub trait GLWEEncryptPkFamily<B: Backend> = VecZnxDftAllocBytes - + VecZnxBigAllocBytes - + SvpPPolAllocBytes - + SvpPrepare<B> - + SvpApply<B> - + VecZnxDftToVecZnxBigConsume<B> - + VecZnxBigAddNormal<B> - + VecZnxBigAddSmallInplace<B> - + VecZnxBigNormalize<B> - + VecZnxNormalizeTmpBytes; -pub trait GLWEExternalProductFamily<B: Backend> = VecZnxDftAllocBytes - + VmpApplyTmpBytes - + VmpApply<B> - + VmpApplyAdd<B> - + VecZnxDftFromVecZnx<B> - + VecZnxDftToVecZnxBigConsume<B> - + VecZnxBigNormalize<B> - + VecZnxNormalizeTmpBytes; -pub trait GLWEKeyswitchFamily<B: Backend> = VecZnxDftAllocBytes - + VmpApplyTmpBytes - + VecZnxBigNormalizeTmpBytes - + VmpApplyTmpBytes - + VmpApply<B> - + VmpApplyAdd<B> - + VecZnxDftFromVecZnx<B> - + VecZnxDftToVecZnxBigConsume<B> - + VecZnxBigAddSmallInplace<B> - + VecZnxBigNormalize<B>; -pub trait GLWEPackingFamily<B: Backend> = GLWEKeyswitchFamily<B> - + VecZnxCopy - + VecZnxRotateInplace - + VecZnxSub - + VecZnxNegateInplace - + VecZnxRshInplace - + VecZnxAddInplace - + VecZnxNormalizeInplace<B> - + VecZnxSubABInplace - + VecZnxRotate - + VecZnxAutomorphismInplace - + VecZnxBigSubSmallBInplace<B> - + VecZnxBigAutomorphismInplace<B>; -pub trait GLWESecretPreparedModuleFamily<B: Backend> = SvpPrepare<B> + SvpPPolAllocBytes + SvpPPolAlloc<B>; -pub trait GGLWEPreparedLayoutFamily<B: Backend> = VmpPMatAlloc<B> + VmpPMatAllocBytes + VmpPMatPrepare<B>; -pub trait GLWETraceModuleFamily<B: Backend> = - GLWEKeyswitchFamily<B> + VecZnxCopy + VecZnxRshInplace + VecZnxBigAutomorphismInplace<B>; -pub trait GLWETraceScratchFamily<B: Backend> = TakeVecZnxDft<B> + ScratchAvailable; -pub trait GGSWLayoutFamily<B: Backend> = VmpPMatAlloc<B> + VmpPMatAllocBytes + VmpPMatPrepare<B>; - -pub trait DecompressFamily<B: Backend> = VecZnxFillUniform + VecZnxCopy; -pub trait Decompress<B: Backend, C> { - fn decompress(&mut self, module: &Module<B>, other: &C) - where - Module<B>: DecompressFamily<B>; -}
A poulpy/Cargo.toml

@@ -0,0 +1,10 @@

+[package] +name = "poulpy" +version = "0.1.0" +edition = "2024" + +[dependencies] +backend = {path="../backend"} +core = {path="../core"} +schemes = {path="../schemes"} +sampling = {path="../sampling"}
A poulpy/README.md

@@ -0,0 +1,171 @@

+# 🐙 Poulpy + +<p align="center"> +<img src="poulpy.png" /> +</p> + +[![CI](https://github.com/phantomzone-org/poulpy/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/phantomzone-org/poulpy/actions/workflows/ci.yml) + +**Poulpy** is a fast & modular FHE library that implements Ring-Learning-With-Errors based homomorphic encryption. It adopts the bivariate polynomial representation proposed in [Revisiting Key Decomposition Techniques for FHE: Simpler, Faster and More Generic](https://eprint.iacr.org/2023/771). In addition to simpler and more efficient arithmetic than the residue number system (RNS), this representation provides a common plaintext space for all schemes and allows easy switching between any two schemes. Poulpy also decouples the schemes implementations from the polynomial arithmetic backend by being built around a hardware abstraction layer (HAL). This enables user to easily provide or use a custom backend. + +### Bivariate Polynomial Representation + +Existing FHE implementations (such as [Lattigo](https://github.com/tuneinsight/lattigo) or [OpenFHE](https://github.com/openfheorg/openfhe-development)) use the [residue-number-system](https://en.wikipedia.org/wiki/Residue_number_system) (RNS) to represent large integers. Although the parallelism and carry-less arithmetic provided by the RNS representation provides a very efficient modular arithmetic over large-integers, it suffers from various drawbacks when used in the context of FHE. The main idea behind the bivariate representation is to decouple the cyclotomic arithmetic from the large number arithmetic. Instead of using the RNS representation for large integer, integers are decomposed in base $2^{-K}$ over the Torus $\mathbb{T}_{N}[X]$. + +This provides the following benefits: + +- **Intuitive, efficient and reusable parameterization & instances:** Only the bit-size of the modulus is required from the user (i.e. Torus precision). As such, parameterization is natural and generic, and instances can be reused for any circuit consuming the same homomorphic capacity, without loss of efficiency. With the RNS representation, individual NTT friendly primes needs to be specified for each level, making the parameterization not user friendly and circuit-specific. + +- **Optimal and granular rescaling:** Ciphertext rescaling is carried out with bit-shifting, enabling a bit-level granular rescaling and optimal noise/homomorphic capacity management. In the RNS representation, ciphertext division can only be done by one of the primes composing the modulus, leading to difficult scaling management and frequent inefficient noise/homomorphic capacity management. + +- **Linear number of DFT in the half external product:** The bivariate representation of the coefficients implicitly provides the digit decomposition, as such the number of DFT is linear in the number of limbs, contrary to the RNS representation where it is quadratic due to the RNS basis conversion. This enables a much more efficient key-switching, which is the **most used and expensive** FHE operation. + +- **Unified plaintext space:** The bivariate polynomial representation is by essence a high precision discretized representation of the Torus $\mathbb{T}_{N}[X]$. Using the Torus as the common plaintext space for all schemes achieves the vision of [CHIMERA: Combining Ring-LWE-based Fully Homomorphic Encryption Schemes](https://eprint.iacr.org/2018/758) which is to unify all RLWE-based FHE schemes (TFHE, FHEW, BGV, BFV, CLPX, GBFV, CKKS, ...) under a single scheme with different encodings, enabling native and efficient scheme-switching functionalities. + +- **Simpler implementation**: Since the cyclotomic arithmetic is decoupled from the coefficient representation, the same pipeline (including DFT) can be reused for all limbs (unlike in the RNS representation), making this representation a prime target for hardware acceleration. + +- **Deterministic computation**: Although being defined on the Torus, bivariate arithmetic remains integer polynomial arithmetic, ensuring all computations are deterministic, the contract being that output should be reproducible and identical, regardless of the backend or hardware. + +### Hardware Abstraction Layer + +In addition to providing a general purpose FHE library over a unified plaintext space, Poulpy is also designed from the ground up around a **hardware abstraction layer** that closely matches the API of [spqlios-arithmetic](https://github.com/tfhe/spqlios-arithmetic). The bivariate representation is by itself hardware friendly as it uses flat, aligned & vectorized memory layout. Finally, generic opaque write only structs (prepared versions) are provided, making it easy for developers to provide hardware focused/optimized operations. This makes possible for anyone to provide or use a custom backend. + +## Library Overview + +- **`backend/hal`**: hardware abstraction layer. This layer targets users that want to provide their own backend or use a third party backend. + + - **`api`**: fixed public low-level polynomial level arithmetic API closely matching spqlios-arithmetic. The goal is to eventually freeze this API, in order to decouple it from the OEP traits, ensuring that changes to implementations do not affect the front end API. + + ```rust + pub trait SvpPrepare<B: Backend> { + fn svp_prepare<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) + where + R: SvpPPolToMut<B>, + A: ScalarZnxToRef; + } + ```` + + - **`delegates`**: link between the user facing API and implementation OEP. Each trait of `api` is implemented by calling its corresponding trait on the `oep`. + + ```rust + impl<B> SvpPrepare<B> for Module<B> + where + B: Backend + SvpPrepareImpl<B>, + { + fn svp_prepare<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) + where + R: SvpPPolToMut<B>, + A: ScalarZnxToRef, + { + B::svp_prepare_impl(self, res, res_col, a, a_col); + } + } + ``` + + - **`layouts`**: defines the layouts of the front-end algebraic structs matching spqlios-arithmetic definitions, such as `ScalarZnx`, `VecZnx` or opaque backend prepared struct such as `SvpPPol` and `VmpPMat`. + + ```rust + pub struct SvpPPol<D: Data, B: Backend> { + data: D, + n: usize, + cols: usize, + _phantom: PhantomData<B>, + } + ``` + + - **`oep`**: open extension points, which can be implemented by the user to provide a custom backend. + + ```rust + pub unsafe trait SvpPrepareImpl<B: Backend> { + fn svp_prepare_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize) + where + R: SvpPPolToMut<B>, + A: ScalarZnxToRef; + } + ``` + + - **`tests`**: exported generic tests for the OEP/structs. Their goal is to enable a user to automatically be able to test its backend implementation, without having to re-implement any tests. + +- **`backend/implementation`**: + - **`cpu_spqlios`**: concrete cpu implementation of the hal through the oep using bindings on spqlios-arithmetic. This implementation currently supports the `FFT64` backend and will be extended to support the `NTT120` backend once it is available in spqlios-arithmetic. + + ```rust + unsafe impl SvpPrepareImpl<Self> for FFT64 { + fn svp_prepare_impl<R, A>(module: &Module<Self>, res: &mut R, res_col: usize, a: &A, a_col: usize) + where + R: SvpPPolToMut<Self>, + A: ScalarZnxToRef, + { + unsafe { + svp::svp_prepare( + module.ptr(), + res.to_mut().at_mut_ptr(res_col, 0) as *mut svp::svp_ppol_t, + a.to_ref().at_ptr(a_col, 0), + ) + } + } + } + ``` + +- **`core`**: core of the FHE library, implementing scheme agnostic RLWE arithmetic for LWE, GLWE, GGLWE and GGSW ciphertexts. It notably includes all possible cross-ciphertext operations, for example applying an external product on a GGLWE or an automorphism on a GGSW, as well as blind rotation. This crate is entirely implemented using the hardware abstraction layer API, and is thus solely defined over generic and traits (including tests). As such it will work over any backend, as long as it implements the necessary traits defined in the OEP. + + ```rust + pub struct GLWESecret<D: Data> { + pub(crate) data: ScalarZnx<D>, + pub(crate) dist: Distribution, + } + + pub struct GLWESecrecPrepared<D: Data, B: Backend> { + pub(crate) data: SvpPPol<D, B>, + pub(crate) dist: Distribution, + } + + impl<D: DataMut, B: Backend> GLWESecretPrepared<D, B> { + pub fn prepare<O>(&mut self, module: &Module<B>, sk: &GLWESecret<O>) + where + O: DataRef, + Module<B>: SvpPrepare<B>, + { + (0..self.rank()).for_each(|i| { + module.svp_prepare(&mut self.data, i, &sk.data, i); + }); + self.dist = sk.dist + } + } + ``` + +## Installation + +TBD — currently not published on crates.io. Clone the repository and use via path-based dependencies. + +## Documentation + +* Full `cargo doc` documentation is coming soon. +* Architecture diagrams and design notes will be added in the [`/doc`](./doc) folder. + +## Contributing + +We welcome external contributions, please see [CONTRIBUTING](./CONTRIBUTING.md). + +## Security + +Please see [SECURITY](./SECURITY.md). + +## License + +Poulpy is licensed under the Apache 2.0 License. See [NOTICE](./NOTICE) & [LICENSE](./LICENSE). + +## Acknowledgement + +**Poulpy** is inspired by the modular architecture of [Lattigo](https://github.com/tuneinsight/lattigo) and [TFHE-go](https://github.com/sp301415/tfhe-go), and its development is lead by Lattigo’s co-author and main contributor [@Pro7ech](https://github.com/Pro7ech). Poulpy reflects the experience gained from over five years of designing and maintaining Lattigo, and represents the next evolution in architecture, performance, and backend philosophy. + +## Citing +Please use the following BibTex entry for citing Lattigo + + @misc{poulpy, + title = {Poulpy v0.1.0}, + howpublished = {Online: \url{https://github.com/phantomzone-org/poulpy}}, + month = Aug, + year = 2025, + note = {Phantom Zone} + }
A poulpy/examples/circuit_bootstrapping.rs

@@ -0,0 +1,218 @@

+use core::{ + GLWEOperations, + layouts::{ + GGSWCiphertext, GLWECiphertext, GLWEPlaintext, GLWESecret, Infos, LWECiphertext, LWEPlaintext, LWESecret, + prepared::{GGSWCiphertextPrepared, GLWESecretPrepared, PrepareAlloc}, + }, +}; +use std::time::Instant; + +use backend::{ + hal::{ + api::{ModuleNew, ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxNormalizeInplace, ZnxView, ZnxViewMut}, + layouts::{Module, ScalarZnx, ScratchOwned}, + }, + implementation::cpu_spqlios::FFT64, +}; + +use sampling::source::Source; +use schemes::tfhe::{ + blind_rotation::CGGI, + circuit_bootstrapping::{ + CircuitBootstrappingKey, CircuitBootstrappingKeyEncryptSk, CircuitBootstrappingKeyPrepared, CirtuitBootstrappingExecute, + }, +}; + +fn main() { + // GLWE ring degree + let n_glwe: usize = 1024; + + // Module provides access to the backend arithmetic + let module: Module<FFT64> = Module::<FFT64>::new(n_glwe as u64); + + // Base 2 loga + let basek: usize = 13; + + // Lookup table extension factor + let extension_factor: usize = 1; + + // GLWE rank + let rank: usize = 1; + + // Noise (discrete) standard deviation + let sigma: f64 = 3.2; + + // LWE degree + let n_lwe: usize = 574; + + // LWE plaintext modulus + let k_lwe_pt: usize = 1; + + // LWE ciphertext modulus + let k_lwe_ct: usize = 13; + + // LWE block binary key block size + let block_size: usize = 7; + + // GGSW output number of rows + let rows_ggsw_res: usize = 2; + + // GGSW output modulus + let k_ggsw_res: usize = (rows_ggsw_res + 1) * basek; + + // Blind rotation key GGSW number of rows + let rows_brk: usize = rows_ggsw_res + 1; + + // Blind rotation key GGSW modulus + let k_brk: usize = (rows_brk + 1) * basek; + + // GGLWE automorphism keys number of rows + let rows_trace: usize = rows_ggsw_res + 1; + + // GGLWE automorphism keys modulus + let k_trace: usize = (rows_trace + 1) * basek; + + // GGLWE tensor key number of rows + let rows_tsk: usize = rows_ggsw_res + 1; + + // GGLWE tensor key modulus + let k_tsk: usize = (rows_tsk + 1) * basek; + + // Scratch space (4MB) + let mut scratch: ScratchOwned<FFT64> = ScratchOwned::alloc(1 << 22); + + // Secret key sampling source + let mut source_xs: Source = Source::new([1u8; 32]); + + // Public randomness sampling source + let mut source_xa: Source = Source::new([1u8; 32]); + + // Noise sampling source + let mut source_xe: Source = Source::new([1u8; 32]); + + // LWE secret + let mut sk_lwe: LWESecret<Vec<u8>> = LWESecret::alloc(n_lwe); + sk_lwe.fill_binary_block(block_size, &mut source_xs); + sk_lwe.fill_zero(); + + // GLWE secret + let mut sk_glwe: GLWESecret<Vec<u8>> = GLWESecret::alloc(n_glwe, rank); + sk_glwe.fill_ternary_prob(0.5, &mut source_xs); + // sk_glwe.fill_zero(); + + // GLWE secret prepared (opaque backend dependant write only struct) + let sk_glwe_prepared: GLWESecretPrepared<Vec<u8>, FFT64> = sk_glwe.prepare_alloc(&module, scratch.borrow()); + + // Plaintext value to circuit bootstrap + let data: i64 = 1 % (1 << k_lwe_pt); + + // LWE plaintext + let mut pt_lwe: LWEPlaintext<Vec<u8>> = LWEPlaintext::alloc(basek, k_lwe_pt); + + // LWE plaintext(data * 2^{- (k_lwe_pt - 1)}) + pt_lwe.encode_i64(data, k_lwe_pt + 1); // +1 for padding bit + module.vec_znx_normalize_inplace(basek, pt_lwe.data_mut(), 0, scratch.borrow()); + + println!("pt_lwe: {}", pt_lwe); + + // LWE ciphertext + let mut ct_lwe: LWECiphertext<Vec<u8>> = LWECiphertext::alloc(n_lwe, basek, k_lwe_ct); + + // Encrypt LWE Plaintext + ct_lwe.encrypt_sk( + &module, + &pt_lwe, + &sk_lwe, + &mut source_xa, + &mut source_xe, + sigma, + ); + + let now: Instant = Instant::now(); + + // Circuit bootstrapping evaluation key + let cbt_key: CircuitBootstrappingKey<Vec<u8>, CGGI> = CircuitBootstrappingKey::encrypt_sk( + &module, + basek, + &sk_lwe, + &sk_glwe, + k_brk, + rows_brk, + k_trace, + rows_trace, + k_tsk, + rows_tsk, + &mut source_xa, + &mut source_xe, + sigma, + scratch.borrow(), + ); + println!("CBT-KGEN: {} ms", now.elapsed().as_millis()); + + // Output GGSW + let mut res: GGSWCiphertext<Vec<u8>> = GGSWCiphertext::alloc(n_glwe, basek, k_ggsw_res, rows_ggsw_res, 1, rank); + + // Circuit bootstrapping key prepared (opaque backend dependant write only struct) + let cbt_prepared: CircuitBootstrappingKeyPrepared<Vec<u8>, CGGI, FFT64> = cbt_key.prepare_alloc(&module, scratch.borrow()); + + // Apply circuit bootstrapping: LWE(data * 2^{- (k_lwe_pt + 2)}) -> GGSW(data) + let now: Instant = Instant::now(); + cbt_prepared.execute_to_constant( + &module, + &mut res, + &ct_lwe, + k_lwe_pt, + extension_factor, + scratch.borrow(), + ); + println!("CBT: {} ms", now.elapsed().as_millis()); + + // Allocate "ideal" GGSW(data) plaintext + let mut pt_ggsw: ScalarZnx<Vec<u8>> = ScalarZnx::alloc(n_glwe, 1); + pt_ggsw.at_mut(0, 0)[0] = data; + + // Prints noise of GGSW(data) + res.print_noise(&module, &sk_glwe_prepared, &pt_ggsw); + + // Tests RLWE(1) * GGSW(data) + + // GLWE ciphertext modulus + let mut ct_glwe: GLWECiphertext<Vec<u8>> = GLWECiphertext::alloc(n_glwe, basek, k_ggsw_res - basek, rank); + + // Some GLWE plaintext with signed data + let k_glwe_pt: usize = 3; + let mut pt_glwe: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(n_glwe, basek, basek); + let mut data_vec: Vec<i64> = vec![0i64; n_glwe]; + data_vec + .iter_mut() + .enumerate() + .for_each(|(x, y)| *y = (x % (1 << (k_glwe_pt - 1))) as i64 - (1 << (k_glwe_pt - 2))); + + pt_glwe.encode_vec_i64(&data_vec, k_lwe_pt + 2); + pt_glwe.normalize_inplace(&module, scratch.borrow()); + + println!("{}", pt_glwe); + + // Encrypt + ct_glwe.encrypt_sk( + &module, + &pt_glwe, + &sk_glwe_prepared, + &mut source_xa, + &mut source_xe, + sigma, + scratch.borrow(), + ); + + // Prepare GGSW output of circuit bootstrapping (opaque backend dependant write only struct) + let res_prepared: GGSWCiphertextPrepared<Vec<u8>, FFT64> = res.prepare_alloc(&module, scratch.borrow()); + + // Apply GLWE x GGSW + ct_glwe.external_product_inplace(&module, &res_prepared, scratch.borrow()); + + // Decrypt + let mut pt_res: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(n_glwe, basek, ct_glwe.k()); + ct_glwe.decrypt(&module, &mut pt_res, &sk_glwe_prepared, scratch.borrow()); + + println!("pt_res: {:?}", &pt_res.data.at(0, 0)[..64]); +}
A poulpy/src/lib.rs

@@ -0,0 +1,15 @@

+pub mod backend { + pub use ::backend::*; +} + +pub mod core { + pub use ::core::*; +} + +pub mod sampling { + pub use ::sampling::*; +} + +pub mod schemes { + pub use ::schemes::*; +}
M schemes/src/lib.rs → schemes/src/lib.rs

@@ -1,2 +1,1 @@

-#![feature(trait_alias)] pub mod tfhe;
M schemes/src/tfhe/blind_rotation/cggi_algo.rs → schemes/src/tfhe/blind_rotation/cggi_algo.rs

@@ -1,10 +1,11 @@

use backend::hal::{ api::{ ScratchAvailable, SvpApply, SvpPPolAllocBytes, TakeVecZnx, TakeVecZnxBig, TakeVecZnxDft, TakeVecZnxDftSlice, - TakeVecZnxSlice, VecZnxAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, VecZnxBigNormalizeTmpBytes, VecZnxCopy, - VecZnxDftAdd, VecZnxDftAddInplace, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftSubABInplace, VecZnxDftToVecZnxBig, - VecZnxDftToVecZnxBigTmpBytes, VecZnxDftZero, VecZnxMulXpMinusOneInplace, VecZnxNormalize, VecZnxNormalizeInplace, - VecZnxRotate, VecZnxSubABInplace, VmpApplyTmpBytes, ZnxView, ZnxZero, + TakeVecZnxSlice, VecZnxAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, VecZnxBigNormalize, + VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAdd, VecZnxDftAddInplace, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, + VecZnxDftSubABInplace, VecZnxDftToVecZnxBig, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpBytes, VecZnxDftZero, + VecZnxMulXpMinusOneInplace, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotate, + VecZnxSubABInplace, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, ZnxView, ZnxZero, }, layouts::{Backend, DataMut, DataRef, Module, Scratch, SvpPPol, VecZnx}, };

@@ -13,36 +14,12 @@

use core::{ Distribution, GLWEOperations, TakeGLWECt, layouts::{GLWECiphertext, GLWECiphertextToMut, Infos, LWECiphertext, LWECiphertextToRef}, - trait_families::GLWEExternalProductFamily, }; use crate::tfhe::blind_rotation::{ BlincRotationExecute, BlindRotationKeyPrepared, CGGI, LookUpTable, LookUpTableRotationDirection, }; -pub trait CCGIBlindRotationFamily<B: Backend> = VecZnxBigAllocBytes - + VecZnxDftAllocBytes - + SvpPPolAllocBytes - + VmpApplyTmpBytes - + VecZnxBigNormalizeTmpBytes - + VecZnxDftToVecZnxBigTmpBytes - + VecZnxDftToVecZnxBig<B> - + VecZnxDftAdd<B> - + VecZnxDftAddInplace<B> - + VecZnxDftFromVecZnx<B> - + VecZnxDftZero<B> - + SvpApply<B> - + VecZnxDftSubABInplace<B> - + VecZnxBigAddSmallInplace<B> - + GLWEExternalProductFamily<B> - + VecZnxRotate - + VecZnxAddInplace - + VecZnxSubABInplace - + VecZnxNormalize<B> - + VecZnxNormalizeInplace<B> - + VecZnxCopy - + VecZnxMulXpMinusOneInplace; - pub fn cggi_blind_rotate_scratch_space<B: Backend>( module: &Module<B>, n: usize,

@@ -55,7 +32,12 @@ rows: usize,

rank: usize, ) -> usize where - Module<B>: CCGIBlindRotationFamily<B>, + Module<B>: VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxNormalizeTmpBytes + + VecZnxBigAllocBytes + + VecZnxDftToVecZnxBigTmpBytes + + VecZnxBigNormalizeTmpBytes, { let brk_size: usize = k_brk.div_ceil(basek);

@@ -89,7 +71,32 @@ }

impl<D: DataRef, B: Backend> BlincRotationExecute<B> for BlindRotationKeyPrepared<D, CGGI, B> where - Module<B>: CCGIBlindRotationFamily<B>, + Module<B>: VecZnxBigAllocBytes + + VecZnxDftAllocBytes + + SvpPPolAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpBytes + + VecZnxDftToVecZnxBig<B> + + VecZnxDftAdd<B> + + VecZnxDftAddInplace<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftZero<B> + + SvpApply<B> + + VecZnxDftSubABInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxRotate + + VecZnxAddInplace + + VecZnxSubABInplace + + VecZnxNormalize<B> + + VecZnxNormalizeInplace<B> + + VecZnxCopy + + VecZnxMulXpMinusOneInplace + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes, Scratch<B>: TakeVecZnxDftSlice<B> + TakeVecZnxDft<B> + TakeVecZnxBig<B> + TakeVecZnxSlice + TakeVecZnx + ScratchAvailable, { fn execute<DR: DataMut, DI: DataRef>(

@@ -126,7 +133,29 @@ ) where

DataRes: DataMut, DataIn: DataRef, DataBrk: DataRef, - Module<B>: CCGIBlindRotationFamily<B>, + Module<B>: VecZnxBigAllocBytes + + VecZnxDftAllocBytes + + SvpPPolAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpBytes + + VecZnxDftToVecZnxBig<B> + + VecZnxDftAdd<B> + + VecZnxDftAddInplace<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftZero<B> + + SvpApply<B> + + VecZnxDftSubABInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxRotate + + VecZnxAddInplace + + VecZnxSubABInplace + + VecZnxNormalize<B> + + VecZnxNormalizeInplace<B> + + VecZnxCopy + + VecZnxMulXpMinusOneInplace + + VecZnxBigNormalize<B> + + VmpApply<B>, Scratch<B>: TakeVecZnxDftSlice<B> + TakeVecZnxDft<B> + TakeVecZnxBig<B> + TakeVecZnxSlice + ScratchAvailable + TakeVecZnx, { let n_glwe: usize = brk.n();

@@ -271,7 +300,29 @@ ) where

DataRes: DataMut, DataIn: DataRef, DataBrk: DataRef, - Module<B>: CCGIBlindRotationFamily<B>, + Module<B>: VecZnxBigAllocBytes + + VecZnxDftAllocBytes + + SvpPPolAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpBytes + + VecZnxDftToVecZnxBig<B> + + VecZnxDftAdd<B> + + VecZnxDftAddInplace<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftZero<B> + + SvpApply<B> + + VecZnxDftSubABInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxRotate + + VecZnxAddInplace + + VecZnxSubABInplace + + VecZnxNormalize<B> + + VecZnxNormalizeInplace<B> + + VecZnxCopy + + VecZnxMulXpMinusOneInplace + + VmpApply<B> + + VecZnxBigNormalize<B>, Scratch<B>: TakeVecZnxDftSlice<B> + TakeVecZnxDft<B> + TakeVecZnxBig<B> + TakeVecZnxSlice + ScratchAvailable + TakeVecZnx, { let n_glwe: usize = brk.n();

@@ -363,7 +414,32 @@ ) where

DataRes: DataMut, DataIn: DataRef, DataBrk: DataRef, - Module<B>: CCGIBlindRotationFamily<B>, + Module<B>: VecZnxBigAllocBytes + + VecZnxDftAllocBytes + + SvpPPolAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpBytes + + VecZnxDftToVecZnxBig<B> + + VecZnxDftAdd<B> + + VecZnxDftAddInplace<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftZero<B> + + SvpApply<B> + + VecZnxDftSubABInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxRotate + + VecZnxAddInplace + + VecZnxSubABInplace + + VecZnxNormalize<B> + + VecZnxNormalizeInplace<B> + + VecZnxCopy + + VecZnxMulXpMinusOneInplace + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes, Scratch<B>: TakeVecZnxDftSlice<B> + TakeVecZnxDft<B> + TakeVecZnxBig<B> + TakeVecZnxSlice + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]

@@ -454,7 +530,7 @@ LookUpTableRotationDirection::Right => {}

} if basek > log2n { - let diff: usize = basek - log2n; + let diff: usize = basek - (log2n - 1); // additional -1 because we map to [-N/2, N/2) instead of [0, N) res.iter_mut().for_each(|x| { *x = div_round_by_pow2(x, diff); })
M schemes/src/tfhe/blind_rotation/cggi_key.rs → schemes/src/tfhe/blind_rotation/cggi_key.rs

@@ -1,6 +1,9 @@

use backend::hal::{ api::{ - ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxAddScalarInplace, VmpPMatAlloc, VmpPMatPrepare, ZnxView, ZnxViewMut, + ScratchAvailable, SvpApplyInplace, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, + VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VmpPMatAlloc, + VmpPrepare, ZnxView, ZnxViewMut, }, layouts::{Backend, DataMut, DataRef, Module, ScalarZnx, ScalarZnxToRef, Scratch}, };

@@ -15,7 +18,6 @@ GGSWCiphertext, LWESecret,

compressed::GGSWCiphertextCompressed, prepared::{GGSWCiphertextPrepared, GLWESecretPrepared}, }, - trait_families::GGSWEncryptSkFamily, }; use crate::tfhe::blind_rotation::{

@@ -38,7 +40,7 @@

impl BlindRotationKey<Vec<u8>, CGGI> { pub fn generate_from_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank: usize) -> usize where - Module<B>: GGSWEncryptSkFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes, { GGSWCiphertext::encrypt_sk_scratch_space(module, n, basek, k, rank) }

@@ -46,7 +48,20 @@ }

impl<D: DataMut, B: Backend> BlindRotationKeyEncryptSk<B> for BlindRotationKey<D, CGGI> where - Module<B>: GGSWEncryptSkFamily<B> + VecZnxAddScalarInplace, + Module<B>: VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { fn encrypt_sk<DataSkGLWE, DataSkLWE>(

@@ -92,7 +107,7 @@ }

impl<B: Backend> BlindRotationKeyPreparedAlloc<B> for BlindRotationKeyPrepared<Vec<u8>, CGGI, B> where - Module<B>: VmpPMatAlloc<B> + VmpPMatPrepare<B>, + Module<B>: VmpPMatAlloc<B> + VmpPrepare<B>, { fn alloc(module: &Module<B>, n_glwe: usize, n_lwe: usize, basek: usize, k: usize, rows: usize, rank: usize) -> Self { let mut data: Vec<GGSWCiphertextPrepared<Vec<u8>, B>> = Vec::with_capacity(n_lwe);

@@ -127,7 +142,7 @@ }

pub fn generate_from_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize, rank: usize) -> usize where - Module<B>: GGSWEncryptSkFamily<B>, + Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes, { GGSWCiphertextCompressed::encrypt_sk_scratch_space(module, n, basek, k, rank) }

@@ -146,7 +161,20 @@ scratch: &mut Scratch<B>,

) where DataSkGLWE: DataRef, DataSkLWE: DataRef, - Module<B>: GGSWEncryptSkFamily<B> + VecZnxAddScalarInplace, + Module<B>: VecZnxAddScalarInplace + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { #[cfg(debug_assertions)]
M schemes/src/tfhe/blind_rotation/key_prepared.rs → schemes/src/tfhe/blind_rotation/key_prepared.rs

@@ -1,5 +1,5 @@

use backend::hal::{ - api::{SvpPPolAlloc, SvpPrepare, VmpPMatAlloc, VmpPMatPrepare}, + api::{SvpPPolAlloc, SvpPrepare, VmpPMatAlloc, VmpPrepare}, layouts::{Backend, Data, DataMut, DataRef, Module, ScalarZnx, Scratch, SvpPPol}, };

@@ -89,7 +89,7 @@

impl<DM: DataMut, DR: DataRef, BRA: BlindRotationAlgo, B: Backend> Prepare<B, BlindRotationKey<DR, BRA>> for BlindRotationKeyPrepared<DM, BRA, B> where - Module<B>: VmpPMatAlloc<B> + VmpPMatPrepare<B> + SvpPPolAlloc<B> + SvpPrepare<B>, + Module<B>: VmpPMatAlloc<B> + VmpPrepare<B> + SvpPPolAlloc<B> + SvpPrepare<B>, { fn prepare(&mut self, module: &Module<B>, other: &BlindRotationKey<DR, BRA>, scratch: &mut Scratch<B>) { #[cfg(debug_assertions)]
M schemes/src/tfhe/blind_rotation/lut.rs → schemes/src/tfhe/blind_rotation/lut.rs

@@ -183,6 +183,7 @@ (self + rhs / 2) / rhs

} } +#[allow(dead_code)] fn max_bit_size(vec: &[i64]) -> u32 { vec.iter() .map(|&v| {
M schemes/src/tfhe/blind_rotation/tests/generic_blind_rotation.rs → schemes/src/tfhe/blind_rotation/tests/generic_blind_rotation.rs

@@ -1,7 +1,12 @@

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxFillUniform, VecZnxRotateInplace, - VecZnxSub, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, ZnxView, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, + VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAdd, VecZnxDftAddInplace, + VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftSubABInplace, VecZnxDftToVecZnxBig, VecZnxDftToVecZnxBigConsume, + VecZnxDftToVecZnxBigTmpBytes, VecZnxDftZero, VecZnxFillUniform, VecZnxMulXpMinusOneInplace, VecZnxNormalize, + VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotate, VecZnxRotateInplace, VecZnxSub, VecZnxSubABInplace, + VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, ZnxView, }, layouts::{Backend, Module, ScratchOwned}, oep::{

@@ -12,23 +17,45 @@ };

use sampling::source::Source; use crate::tfhe::blind_rotation::{ - BlincRotationExecute, BlindRotationKey, BlindRotationKeyAlloc, BlindRotationKeyEncryptSk, BlindRotationKeyPrepared, - CCGIBlindRotationFamily, CGGI, LookUpTable, cggi_blind_rotate_scratch_space, mod_switch_2n, + BlincRotationExecute, BlindRotationKey, BlindRotationKeyAlloc, BlindRotationKeyEncryptSk, BlindRotationKeyPrepared, CGGI, + LookUpTable, cggi_blind_rotate_scratch_space, mod_switch_2n, }; -use core::{ - layouts::{ - GLWECiphertext, GLWEPlaintext, GLWESecret, Infos, LWECiphertext, LWECiphertextToRef, LWEPlaintext, LWESecret, - prepared::{GLWESecretPrepared, PrepareAlloc}, - }, - trait_families::{GLWEDecryptFamily, GLWESecretPreparedModuleFamily}, +use core::layouts::{ + GLWECiphertext, GLWEPlaintext, GLWESecret, Infos, LWECiphertext, LWECiphertextToRef, LWEPlaintext, LWESecret, + prepared::{GLWESecretPrepared, PrepareAlloc}, }; pub fn test_blind_rotation<B: Backend>(module: &Module<B>, n_lwe: usize, block_size: usize, extension_factor: usize) where - Module<B>: CCGIBlindRotationFamily<B> - + GLWESecretPreparedModuleFamily<B> - + GLWEDecryptFamily<B> + Module<B>: VecZnxBigAllocBytes + + VecZnxDftAllocBytes + + SvpPPolAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VecZnxDftToVecZnxBigTmpBytes + + VecZnxDftToVecZnxBig<B> + + VecZnxDftAdd<B> + + VecZnxDftAddInplace<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftZero<B> + + SvpApply<B> + + VecZnxDftSubABInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxRotate + + VecZnxAddInplace + + VecZnxSubABInplace + + VecZnxNormalize<B> + + VecZnxNormalizeInplace<B> + + VecZnxCopy + + VecZnxMulXpMinusOneInplace + + SvpPrepare<B> + + SvpPPolAlloc<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddInplace<B> + + VecZnxBigNormalize<B> + + VecZnxNormalizeTmpBytes + VecZnxFillUniform + VecZnxAddNormal + VecZnxAddScalarInplace

@@ -36,7 +63,9 @@ + VecZnxRotateInplace

+ VecZnxSwithcDegree + VecZnxSub + VmpPMatAlloc<B> - + VmpPMatPrepare<B>, + + VmpPrepare<B> + + VmpApply<B> + + VmpApplyAdd<B>, B: VecZnxDftAllocBytesImpl<B> + VecZnxBigAllocBytesImpl<B> + ScratchOwnedAllocImpl<B>

@@ -57,7 +86,9 @@ let k_lut: usize = 1 * basek;

let k_res: usize = 2 * basek; let rank: usize = 1; - let message_modulus: usize = 1 << 4; + let log_message_modulus = 4; + + let message_modulus: usize = 1 << log_message_modulus; let mut source_xs: Source = Source::new([2u8; 32]); let mut source_xe: Source = Source::new([2u8; 32]);

@@ -103,10 +134,9 @@ let mut lwe: LWECiphertext<Vec<u8>> = LWECiphertext::alloc(n_lwe, basek, k_lwe);

let mut pt_lwe: LWEPlaintext<Vec<u8>> = LWEPlaintext::alloc(basek, k_lwe); - let x: i64 = 2; - let bits: usize = 8; + let x: i64 = 15 % (message_modulus as i64); - pt_lwe.encode_i64(x, bits); + pt_lwe.encode_i64(x, log_message_modulus + 1); lwe.encrypt_sk( module,

@@ -117,13 +147,16 @@ &mut source_xe,

3.2, ); - let mut f: Vec<i64> = vec![0i64; message_modulus]; - f.iter_mut() + let f = |x: i64| -> i64 { 2 * x + 1 }; + + let mut f_vec: Vec<i64> = vec![0i64; message_modulus]; + f_vec + .iter_mut() .enumerate() - .for_each(|(i, x)| *x = 2 * (i as i64) + 1); + .for_each(|(i, x)| *x = f(i as i64)); let mut lut: LookUpTable = LookUpTable::alloc(n, basek, k_lut, extension_factor); - lut.set(module, &f, message_modulus); + lut.set(module, &f_vec, log_message_modulus + 1); let mut res: GLWECiphertext<Vec<u8>> = GLWECiphertext::alloc(n, basek, k_res, rank);

@@ -157,4 +190,12 @@

// First limb should be exactly equal (test are parameterized such that the noise does not reach // the first limb) assert_eq!(pt_have.data.at(0, 0), lut.data[0].at(0, 0)); + + // Verify that it effectively compute f(x) + let mut have: i64 = pt_have.decode_coeff_i64(log_message_modulus + 1, 0); + + // Get positive representative and assert equality + have = (have + message_modulus as i64) % (message_modulus as i64); + + assert_eq!(have, f(x) % (message_modulus as i64)); }
M schemes/src/tfhe/circuit_bootstrapping/circuit_bootstrapping.rs → schemes/src/tfhe/circuit_bootstrapping/circuit_bootstrapping.rs

@@ -1,50 +1,58 @@

-use std::{collections::HashMap, time::Instant, usize}; +use std::{collections::HashMap, usize}; use backend::hal::{ api::{ ScratchAvailable, TakeMatZnx, TakeVecZnx, TakeVecZnxBig, TakeVecZnxDft, TakeVecZnxDftSlice, TakeVecZnxSlice, - VecZnxAddInplace, VecZnxAutomorphismInplace, VecZnxBigAutomorphismInplace, VecZnxBigSubSmallBInplace, VecZnxCopy, - VecZnxDftCopy, VecZnxDftToVecZnxBigTmpA, VecZnxNegateInplace, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, - VecZnxRotateInplace, VecZnxRshInplace, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, + VecZnxAddInplace, VecZnxAutomorphismInplace, VecZnxBigAddSmallInplace, VecZnxBigAllocBytes, VecZnxBigAutomorphismInplace, + VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxBigSubSmallBInplace, VecZnxCopy, VecZnxDftAddInplace, + VecZnxDftAllocBytes, VecZnxDftCopy, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, + VecZnxNegateInplace, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotate, VecZnxRotateInplace, + VecZnxRshInplace, VecZnxSub, VecZnxSubABInplace, VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, }, layouts::{Backend, DataMut, DataRef, Module, Scratch}, oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl}, }; -use core::{GLWEOperations, TakeGGLWE, TakeGLWECt, layouts::Infos, trait_families::GLWETraceModuleFamily}; +use core::{GLWEOperations, TakeGGLWE, TakeGLWECt, layouts::Infos}; use core::layouts::{GGSWCiphertext, GLWECiphertext, LWECiphertext, prepared::GGLWEAutomorphismKeyPrepared}; use crate::tfhe::{ blind_rotation::{ - BlincRotationExecute, BlindRotationAlgo, BlindRotationKeyPrepared, CCGIBlindRotationFamily, LookUpTable, - LookUpTableRotationDirection, + BlincRotationExecute, BlindRotationAlgo, BlindRotationKeyPrepared, LookUpTable, LookUpTableRotationDirection, }, circuit_bootstrapping::{CircuitBootstrappingKeyPrepared, CirtuitBootstrappingExecute}, }; -pub trait CircuitBootstrapFamily<B: Backend> = VecZnxRotateInplace - + VecZnxNormalizeInplace<B> - + VecZnxNormalizeTmpBytes - + CCGIBlindRotationFamily<B> - + VecZnxSwithcDegree - + VecZnxBigAutomorphismInplace<B> - + VecZnxRshInplace - + VecZnxDftCopy<B> - + VecZnxDftToVecZnxBigTmpA<B> - + VecZnxSub - + VecZnxAddInplace - + VecZnxNegateInplace - + VecZnxCopy - + VecZnxSubABInplace - + GLWETraceModuleFamily<B> - + VecZnxRotateInplace - + VecZnxAutomorphismInplace - + VecZnxBigSubSmallBInplace<B>; - impl<D: DataRef, BRA: BlindRotationAlgo, B: Backend> CirtuitBootstrappingExecute<B> for CircuitBootstrappingKeyPrepared<D, BRA, B> where - Module<B>: CircuitBootstrapFamily<B>, + Module<B>: VecZnxRotateInplace + + VecZnxNormalizeInplace<B> + + VecZnxNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace + + VecZnxDftCopy<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxSub + + VecZnxAddInplace + + VecZnxNegateInplace + + VecZnxCopy + + VecZnxSubABInplace + + VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxBigAllocBytes + + VecZnxDftAddInplace<B> + + VecZnxRotate, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>, Scratch<B>: TakeVecZnx + TakeVecZnxDftSlice<B>

@@ -115,7 +123,33 @@ ) where

DRes: DataMut, DLwe: DataRef, DBrk: DataRef, - Module<B>: CircuitBootstrapFamily<B>, + Module<B>: VecZnxRotateInplace + + VecZnxNormalizeInplace<B> + + VecZnxNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace + + VecZnxDftCopy<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxSub + + VecZnxAddInplace + + VecZnxNegateInplace + + VecZnxCopy + + VecZnxSubABInplace + + VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxBigAllocBytes + + VecZnxDftAddInplace<B> + + VecZnxRotate, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>, Scratch<B>: TakeVecZnxDftSlice<B> + TakeVecZnxBig<B>

@@ -165,13 +199,9 @@ }

// TODO: separate GGSW k from output of blind rotation k let (mut res_glwe, scratch1) = scratch.take_glwe_ct(n, basek, k, rank); - let (mut tmp_gglwe, scratch2) = scratch1.take_gglwe(n, basek, k, rows, 1, rank, rank); - - let now: Instant = Instant::now(); + let (mut tmp_gglwe, scratch2) = scratch1.take_gglwe(n, basek, k, rows, 1, rank.max(1), rank); key.brk.execute(module, &mut res_glwe, &lwe, &lut, scratch2); - - println!("blind_rotate: {} ms", now.elapsed().as_millis()); let gap: usize = 2 * lut.drift / lut.extension_factor();

@@ -181,8 +211,6 @@ (0..rows).for_each(|i| {

let mut tmp_glwe: GLWECiphertext<&mut [u8]> = tmp_gglwe.at_mut(i, 0); if to_exponent { - let now: Instant = Instant::now(); - // Isolates i-th LUT and moves coefficients according to requested gap. post_process( module,

@@ -194,7 +222,6 @@ log_domain,

&key.atk, scratch2, ); - println!("post_process: {} ms", now.elapsed().as_millis()); } else { tmp_glwe.trace(module, 0, module.log_n(), &res_glwe, &key.atk, scratch2); }

@@ -220,7 +247,31 @@ scratch: &mut Scratch<B>,

) where DataRes: DataMut, DataA: DataRef, - Module<B>: CircuitBootstrapFamily<B>, + Module<B>: VecZnxRotateInplace + + VecZnxNormalizeInplace<B> + + VecZnxNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace + + VecZnxDftCopy<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxSub + + VecZnxAddInplace + + VecZnxNegateInplace + + VecZnxCopy + + VecZnxSubABInplace + + VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxRotate, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx, { let log_n: usize = module.log_n();

@@ -248,10 +299,7 @@ res.rotate_inplace(module, -(1 << log_gap_in));

} cts.insert(i as usize * (1 << log_gap_out), res.clone()); }); - - let now: Instant = Instant::now(); pack(module, &mut cts, log_gap_out, auto_keys, scratch); - println!("pack: {} ms", now.elapsed().as_millis()); let packed: GLWECiphertext<Vec<u8>> = cts.remove(&0).unwrap(); res.trace( module,

@@ -271,7 +319,31 @@ log_gap_out: usize,

auto_keys: &HashMap<i64, GGLWEAutomorphismKeyPrepared<Vec<u8>, B>>, scratch: &mut Scratch<B>, ) where - Module<B>: CircuitBootstrapFamily<B>, + Module<B>: VecZnxRotateInplace + + VecZnxNormalizeInplace<B> + + VecZnxNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace + + VecZnxDftCopy<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxSub + + VecZnxAddInplace + + VecZnxNegateInplace + + VecZnxCopy + + VecZnxSubABInplace + + VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxRotate, Scratch<B>: TakeVecZnx + TakeVecZnxDft<B> + ScratchAvailable, { let log_n: usize = module.log_n();

@@ -281,8 +353,6 @@ let k: usize = cts.get(&0).unwrap().k();

let rank: usize = cts.get(&0).unwrap().rank(); (0..log_n - log_gap_out).for_each(|i| { - let now: Instant = Instant::now(); - let t = 16.min(1 << (log_n - 1 - i)); let auto_key: &GGLWEAutomorphismKeyPrepared<Vec<u8>, B>;

@@ -314,8 +384,6 @@ } else if let Some(b) = b {

cts.insert(j, b); } }); - - println!("combine: {} us", now.elapsed().as_micros()); }); }

@@ -330,7 +398,31 @@ i: usize,

auto_key: &GGLWEAutomorphismKeyPrepared<DataAK, B>, scratch: &mut Scratch<B>, ) where - Module<B>: CircuitBootstrapFamily<B>, + Module<B>: VecZnxRotateInplace + + VecZnxNormalizeInplace<B> + + VecZnxNormalizeTmpBytes + + VecZnxSwithcDegree + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace + + VecZnxDftCopy<B> + + VecZnxDftToVecZnxBigTmpA<B> + + VecZnxSub + + VecZnxAddInplace + + VecZnxNegateInplace + + VecZnxCopy + + VecZnxSubABInplace + + VecZnxDftAllocBytes + + VmpApplyTmpBytes + + VecZnxBigNormalizeTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + VecZnxDftFromVecZnx<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigNormalize<B> + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxRotate, Scratch<B>: TakeVecZnx + TakeVecZnxDft<B> + ScratchAvailable, { // Goal is to evaluate: a = a + b*X^t + phi(a - b*X^t))
M schemes/src/tfhe/circuit_bootstrapping/key.rs → schemes/src/tfhe/circuit_bootstrapping/key.rs

@@ -6,16 +6,15 @@ use std::{collections::HashMap, usize};

use backend::hal::{ api::{ - ScratchAvailable, TakeScalarZnx, TakeSvpPPol, TakeVecZnx, TakeVecZnxBig, TakeVecZnxDft, VecZnxAddScalarInplace, - VecZnxAutomorphism, VecZnxSwithcDegree, VmpPMatAlloc, VmpPMatPrepare, + ScratchAvailable, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, TakeScalarZnx, TakeSvpPPol, + TakeVecZnx, TakeVecZnxBig, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, + VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, + VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, + VecZnxSwithcDegree, VmpPMatAlloc, VmpPrepare, }, layouts::{Backend, Data, DataRef, Module, Scratch}, }; use sampling::source::Source; - -use core::trait_families::{ - GGLWEAutomorphismKeyEncryptSkFamily, GGLWETensorKeyEncryptSkFamily, GGSWEncryptSkFamily, GLWESecretPreparedModuleFamily, -}; use crate::tfhe::blind_rotation::{ BlindRotationAlgo, BlindRotationKey, BlindRotationKeyAlloc, BlindRotationKeyEncryptSk, BlindRotationKeyPrepared,

@@ -52,13 +51,27 @@

impl<BRA: BlindRotationAlgo, B: Backend> CircuitBootstrappingKeyEncryptSk<B> for CircuitBootstrappingKey<Vec<u8>, BRA> where BlindRotationKey<Vec<u8>, BRA>: BlindRotationKeyAlloc + BlindRotationKeyEncryptSk<B>, - Module<B>: GGSWEncryptSkFamily<B> - + GLWESecretPreparedModuleFamily<B> + Module<B>: SvpApply<B> + + VecZnxDftToVecZnxBigTmpA<B> + VecZnxAddScalarInplace - + GGLWEAutomorphismKeyEncryptSkFamily<B> - + VecZnxAutomorphism + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxFillUniform + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalizeInplace<B> + + VecZnxAddNormal + + VecZnxNormalize<B> + + VecZnxSub + + SvpPrepare<B> + VecZnxSwithcDegree - + GGLWETensorKeyEncryptSkFamily<B>, + + SvpPPolAllocBytes + + SvpPPolAlloc<B> + + VecZnxAutomorphism, Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx + TakeScalarZnx + TakeSvpPPol<B> + TakeVecZnxBig<B>, { fn encrypt_sk<DLwe, DGlwe>(

@@ -80,6 +93,7 @@ ) -> Self

where DLwe: DataRef, DGlwe: DataRef, + Module<B>:, { let mut auto_keys: HashMap<i64, GGLWEAutomorphismKey<Vec<u8>>> = HashMap::new(); let gal_els: Vec<i64> = GLWECiphertext::trace_galois_elements(&module);

@@ -133,7 +147,7 @@

impl<D: DataRef, BRA: BlindRotationAlgo, B: Backend> PrepareAlloc<B, CircuitBootstrappingKeyPrepared<Vec<u8>, BRA, B>> for CircuitBootstrappingKey<D, BRA> where - Module<B>: VmpPMatAlloc<B> + VmpPMatPrepare<B>, + Module<B>: VmpPMatAlloc<B> + VmpPrepare<B>, BlindRotationKey<D, BRA>: PrepareAlloc<B, BlindRotationKeyPrepared<Vec<u8>, BRA, B>>, GGLWETensorKey<D>: PrepareAlloc<B, GGLWETensorKeyPrepared<Vec<u8>, B>>, GGLWEAutomorphismKey<D>: PrepareAlloc<B, GGLWEAutomorphismKeyPrepared<Vec<u8>, B>>,
M schemes/src/tfhe/circuit_bootstrapping/tests/circuit_bootstrapping.rs → schemes/src/tfhe/circuit_bootstrapping/tests/circuit_bootstrapping.rs

@@ -2,9 +2,14 @@ use std::time::Instant;

use backend::hal::{ api::{ - ScratchOwnedAlloc, ScratchOwnedBorrow, SvpPPolAlloc, SvpPrepare, VecZnxAddNormal, VecZnxAddScalarInplace, - VecZnxAutomorphism, VecZnxFillUniform, VecZnxNormalizeInplace, VecZnxRotateInplace, VecZnxSwithcDegree, VmpPMatAlloc, - VmpPMatPrepare, ZnxView, ZnxViewMut, + ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApply, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, + VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, + VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAlloc, VecZnxBigAllocBytes, VecZnxBigAutomorphismInplace, + VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxBigSubSmallBInplace, VecZnxCopy, VecZnxDftAddInplace, + VecZnxDftAlloc, VecZnxDftAllocBytes, VecZnxDftCopy, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, + VecZnxDftToVecZnxBigTmpA, VecZnxFillUniform, VecZnxNegateInplace, VecZnxNormalize, VecZnxNormalizeInplace, + VecZnxNormalizeTmpBytes, VecZnxRotate, VecZnxRotateInplace, VecZnxRshInplace, VecZnxSub, VecZnxSubABInplace, + VecZnxSwithcDegree, VmpApply, VmpApplyAdd, VmpApplyTmpBytes, VmpPMatAlloc, VmpPrepare, ZnxView, ZnxViewMut, }, layouts::{Backend, Module, ScalarZnx, ScratchOwned}, oep::{

@@ -20,18 +25,11 @@ BlincRotationExecute, BlindRotationAlgo, BlindRotationKey, BlindRotationKeyAlloc, BlindRotationKeyEncryptSk,

BlindRotationKeyPrepared, }, circuit_bootstrapping::{ - CircuitBootstrapFamily, CircuitBootstrappingKey, CircuitBootstrappingKeyEncryptSk, CircuitBootstrappingKeyPrepared, - CirtuitBootstrappingExecute, + CircuitBootstrappingKey, CircuitBootstrappingKeyEncryptSk, CircuitBootstrappingKeyPrepared, CirtuitBootstrappingExecute, }, }; -use core::{ - layouts::prepared::PrepareAlloc, - trait_families::{ - GGLWEAutomorphismKeyEncryptSkFamily, GGLWETensorKeyEncryptSkFamily, GGSWAssertNoiseFamily, GGSWEncryptSkFamily, - GLWEDecryptFamily, - }, -}; +use core::layouts::prepared::PrepareAlloc; use core::layouts::{ GGSWCiphertext, GLWECiphertext, GLWEPlaintext, GLWESecret, LWECiphertext, LWEPlaintext, LWESecret,

@@ -43,19 +41,46 @@ where

Module<B>: VecZnxFillUniform + VecZnxAddNormal + VecZnxNormalizeInplace<B> - + GGSWEncryptSkFamily<B> + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalize<B> + + VecZnxSub + VecZnxAddScalarInplace - + GGLWEAutomorphismKeyEncryptSkFamily<B> + VecZnxAutomorphism + VecZnxSwithcDegree - + GGLWETensorKeyEncryptSkFamily<B> - + CircuitBootstrapFamily<B> - + GLWEDecryptFamily<B> - + GGSWAssertNoiseFamily<B> + + VecZnxBigAllocBytes + + VecZnxDftToVecZnxBigTmpA<B> + + SvpApply<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + VmpPMatAlloc<B> - + VmpPMatPrepare<B> + + VmpPrepare<B> + SvpPrepare<B> - + SvpPPolAlloc<B>, + + SvpPPolAlloc<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + SvpPPolAllocBytes + + VecZnxRotateInplace + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace + + VecZnxDftCopy<B> + + VecZnxNegateInplace + + VecZnxCopy + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxBigAllocBytes + + VecZnxDftAddInplace<B> + + VecZnxRotate, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + TakeVecZnxDftImpl<B>

@@ -108,7 +133,7 @@

let data: i64 = 1; let mut pt_lwe: LWEPlaintext<Vec<u8>> = LWEPlaintext::alloc(basek, k_lwe_pt); - pt_lwe.encode_i64(data, k_lwe_pt + 2); + pt_lwe.encode_i64(data, k_lwe_pt + 1); println!("pt_lwe: {}", pt_lwe);

@@ -203,19 +228,46 @@ where

Module<B>: VecZnxFillUniform + VecZnxAddNormal + VecZnxNormalizeInplace<B> - + GGSWEncryptSkFamily<B> + + VecZnxDftAllocBytes + + VecZnxBigNormalize<B> + + VecZnxDftFromVecZnx<B> + + SvpApplyInplace<B> + + VecZnxDftToVecZnxBigConsume<B> + + VecZnxNormalizeTmpBytes + + VecZnxSubABInplace + + VecZnxAddInplace + + VecZnxNormalize<B> + + VecZnxSub + VecZnxAddScalarInplace - + GGLWEAutomorphismKeyEncryptSkFamily<B> + VecZnxAutomorphism + VecZnxSwithcDegree - + GGLWETensorKeyEncryptSkFamily<B> - + CircuitBootstrapFamily<B> - + GLWEDecryptFamily<B> - + GGSWAssertNoiseFamily<B> + + VecZnxBigAllocBytes + + VecZnxDftToVecZnxBigTmpA<B> + + SvpApply<B> + + VecZnxBigAddInplace<B> + + VecZnxBigAddSmallInplace<B> + + VecZnxBigAlloc<B> + + VecZnxDftAlloc<B> + + VecZnxBigNormalizeTmpBytes + VmpPMatAlloc<B> - + VmpPMatPrepare<B> + + VmpPrepare<B> + SvpPrepare<B> - + SvpPPolAlloc<B>, + + SvpPPolAlloc<B> + + VmpApplyTmpBytes + + VmpApply<B> + + VmpApplyAdd<B> + + SvpPPolAllocBytes + + VecZnxRotateInplace + + VecZnxBigAutomorphismInplace<B> + + VecZnxRshInplace + + VecZnxDftCopy<B> + + VecZnxNegateInplace + + VecZnxCopy + + VecZnxAutomorphismInplace + + VecZnxBigSubSmallBInplace<B> + + VecZnxBigAllocBytes + + VecZnxDftAddInplace<B> + + VecZnxRotate, B: ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B> + TakeVecZnxDftImpl<B>

@@ -268,7 +320,7 @@

let data: i64 = 1; let mut pt_lwe: LWEPlaintext<Vec<u8>> = LWEPlaintext::alloc(basek, k_lwe_pt); - pt_lwe.encode_i64(data, k_lwe_pt + 2); + pt_lwe.encode_i64(data, k_lwe_pt + 1); println!("pt_lwe: {}", pt_lwe);
D utils/Cargo.toml

@@ -1,8 +0,0 @@

-[package] -name = "utils" -version = "0.1.0" -edition = "2021" -license = "Apache-2.0" - -[dependencies] -fnv = "1.0.7"
D utils/src/lib.rs

@@ -1,1 +0,0 @@

-pub mod map;
D utils/src/map.rs

@@ -1,21 +0,0 @@

-use std::hash::Hash; - -use fnv::FnvHashMap; - -pub struct Map<K, V>(pub FnvHashMap<K, V>); - -impl<K: Eq + Hash, V> Map<K, V> { - pub fn new() -> Self { - Self { - 0: FnvHashMap::<K, V>::default(), - } - } - - pub fn insert(&mut self, k: K, data: V) -> Option<V> { - self.0.insert(k, data) - } - - pub fn get(&self, k: &K) -> Option<&V> { - self.0.get(k) - } -}