arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/tests/generics/encryption/ggsw_ct.rs
core/src/tests/generics/encryption/ggsw_ct.rsRaw
  1use backend::hal::{
  2    api::{
  3        ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace,
  4        VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAlloc,
  5        VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAlloc, VecZnxDftAllocBytes,
  6        VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxDftToVecZnxBigTmpA, VecZnxFillUniform, VecZnxNormalize,
  7        VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace, VmpPMatAlloc, VmpPrepare,
  8    },
  9    layouts::{Backend, Module, ScalarZnx, ScratchOwned},
 10    oep::{
 11        ScratchAvailableImpl, ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeScalarZnxImpl, TakeSvpPPolImpl,
 12        TakeVecZnxBigImpl, TakeVecZnxDftImpl, TakeVecZnxImpl, VecZnxBigAllocBytesImpl, VecZnxDftAllocBytesImpl,
 13    },
 14};
 15use sampling::source::Source;
 16
 17use crate::layouts::{
 18    GGSWCiphertext, GLWESecret,
 19    compressed::{Decompress, GGSWCiphertextCompressed},
 20    prepared::{GLWESecretPrepared, PrepareAlloc},
 21};
 22
 23pub fn test_ggsw_encrypt_sk<B: Backend>(module: &Module<B>, basek: usize, k: usize, digits: usize, rank: usize, sigma: f64)
 24where
 25    Module<B>: VecZnxDftAllocBytes
 26        + VecZnxBigNormalize<B>
 27        + VecZnxDftFromVecZnx<B>
 28        + SvpApplyInplace<B>
 29        + VecZnxDftToVecZnxBigConsume<B>
 30        + VecZnxNormalizeTmpBytes
 31        + VecZnxFillUniform
 32        + VecZnxSubABInplace
 33        + VecZnxAddInplace
 34        + VecZnxNormalizeInplace<B>
 35        + VecZnxAddNormal
 36        + VecZnxNormalize<B>
 37        + VecZnxSub
 38        + SvpPrepare<B>
 39        + SvpPPolAllocBytes
 40        + SvpPPolAlloc<B>
 41        + VecZnxBigAddSmallInplace<B>
 42        + VecZnxAddScalarInplace
 43        + VecZnxBigAllocBytes
 44        + VecZnxBigAddInplace<B>
 45        + VecZnxCopy
 46        + VmpPMatAlloc<B>
 47        + VmpPrepare<B>
 48        + VecZnxBigAlloc<B>
 49        + VecZnxDftAlloc<B>
 50        + VecZnxBigNormalizeTmpBytes
 51        + VecZnxDftToVecZnxBigTmpA<B>,
 52    B: TakeVecZnxDftImpl<B>
 53        + TakeVecZnxBigImpl<B>
 54        + TakeSvpPPolImpl<B>
 55        + ScratchOwnedAllocImpl<B>
 56        + ScratchOwnedBorrowImpl<B>
 57        + ScratchAvailableImpl<B>
 58        + TakeScalarZnxImpl<B>
 59        + TakeVecZnxImpl<B>
 60        + VecZnxDftAllocBytesImpl<B>
 61        + VecZnxBigAllocBytesImpl<B>
 62        + TakeSvpPPolImpl<B>,
 63{
 64    let n: usize = module.n();
 65    let rows: usize = (k - digits * basek) / (digits * basek);
 66
 67    let mut ct: GGSWCiphertext<Vec<u8>> = GGSWCiphertext::alloc(n, basek, k, rows, digits, rank);
 68
 69    let mut pt_scalar: ScalarZnx<Vec<u8>> = ScalarZnx::alloc(n, 1);
 70
 71    let mut source_xs: Source = Source::new([0u8; 32]);
 72    let mut source_xe: Source = Source::new([0u8; 32]);
 73    let mut source_xa: Source = Source::new([0u8; 32]);
 74
 75    pt_scalar.fill_ternary_hw(0, n, &mut source_xs);
 76
 77    let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GGSWCiphertext::encrypt_sk_scratch_space(
 78        module, n, basek, k, rank,
 79    ));
 80
 81    let mut sk: GLWESecret<Vec<u8>> = GLWESecret::alloc(n, rank);
 82    sk.fill_ternary_prob(0.5, &mut source_xs);
 83    let sk_prepared: GLWESecretPrepared<Vec<u8>, B> = sk.prepare_alloc(module, scratch.borrow());
 84
 85    ct.encrypt_sk(
 86        module,
 87        &pt_scalar,
 88        &sk_prepared,
 89        &mut source_xa,
 90        &mut source_xe,
 91        sigma,
 92        scratch.borrow(),
 93    );
 94
 95    let noise_f = |_col_i: usize| -(k as f64) + sigma.log2() + 0.5;
 96
 97    ct.assert_noise(module, &sk_prepared, &pt_scalar, &noise_f);
 98}
 99
100pub fn test_ggsw_compressed_encrypt_sk<B: Backend>(
101    module: &Module<B>,
102    basek: usize,
103    k: usize,
104    digits: usize,
105    rank: usize,
106    sigma: f64,
107) where
108    Module<B>: VecZnxDftAllocBytes
109        + VecZnxBigNormalize<B>
110        + VecZnxDftFromVecZnx<B>
111        + SvpApplyInplace<B>
112        + VecZnxDftToVecZnxBigConsume<B>
113        + VecZnxNormalizeTmpBytes
114        + VecZnxFillUniform
115        + VecZnxSubABInplace
116        + VecZnxAddInplace
117        + VecZnxNormalizeInplace<B>
118        + VecZnxAddNormal
119        + VecZnxNormalize<B>
120        + VecZnxSub
121        + SvpPrepare<B>
122        + SvpPPolAllocBytes
123        + SvpPPolAlloc<B>
124        + VecZnxBigAddSmallInplace<B>
125        + VecZnxAddScalarInplace
126        + VecZnxBigAllocBytes
127        + VecZnxBigAddInplace<B>
128        + VecZnxCopy
129        + VmpPMatAlloc<B>
130        + VmpPrepare<B>
131        + VecZnxBigAlloc<B>
132        + VecZnxDftAlloc<B>
133        + VecZnxBigNormalizeTmpBytes
134        + VecZnxDftToVecZnxBigTmpA<B>,
135    B: TakeVecZnxDftImpl<B>
136        + TakeVecZnxBigImpl<B>
137        + ScratchOwnedAllocImpl<B>
138        + ScratchOwnedBorrowImpl<B>
139        + ScratchAvailableImpl<B>
140        + TakeScalarZnxImpl<B>
141        + TakeVecZnxImpl<B>
142        + VecZnxDftAllocBytesImpl<B>
143        + VecZnxBigAllocBytesImpl<B>
144        + TakeSvpPPolImpl<B>,
145{
146    let n: usize = module.n();
147    let rows: usize = (k - digits * basek) / (digits * basek);
148
149    let mut ct_compressed: GGSWCiphertextCompressed<Vec<u8>> = GGSWCiphertextCompressed::alloc(n, basek, k, rows, digits, rank);
150
151    let mut pt_scalar: ScalarZnx<Vec<u8>> = ScalarZnx::alloc(n, 1);
152
153    let mut source_xs: Source = Source::new([0u8; 32]);
154    let mut source_xe: Source = Source::new([0u8; 32]);
155
156    pt_scalar.fill_ternary_hw(0, n, &mut source_xs);
157
158    let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GGSWCiphertextCompressed::encrypt_sk_scratch_space(
159        module, n, basek, k, rank,
160    ));
161
162    let mut sk: GLWESecret<Vec<u8>> = GLWESecret::alloc(n, rank);
163    sk.fill_ternary_prob(0.5, &mut source_xs);
164    let sk_prepared: GLWESecretPrepared<Vec<u8>, B> = sk.prepare_alloc(module, scratch.borrow());
165
166    let seed_xa: [u8; 32] = [1u8; 32];
167
168    ct_compressed.encrypt_sk(
169        module,
170        &pt_scalar,
171        &sk_prepared,
172        seed_xa,
173        &mut source_xe,
174        sigma,
175        scratch.borrow(),
176    );
177
178    let noise_f = |_col_i: usize| -(k as f64) + sigma.log2() + 0.5;
179
180    let mut ct: GGSWCiphertext<Vec<u8>> = GGSWCiphertext::alloc(n, basek, k, rows, digits, rank);
181    ct.decompress(module, &ct_compressed);
182
183    ct.assert_noise(module, &sk_prepared, &pt_scalar, &noise_f);
184}