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