arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-core/src/tests/test_suite/encryption/ggsw_ct.rs
poulpy-core/src/tests/test_suite/encryption/ggsw_ct.rsRaw
  1use poulpy_hal::{
  2    api::{
  3        ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyDftToDftInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare,
  4        VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace, VecZnxBigAlloc,
  5        VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxCopy, VecZnxDftAlloc, VecZnxDftAllocBytes,
  6        VecZnxDftApply, VecZnxFillUniform, VecZnxIdftApplyConsume, VecZnxIdftApplyTmpA, VecZnxNormalize, VecZnxNormalizeInplace,
  7        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>)
 27where
 28    Module<B>: VecZnxDftAllocBytes
 29        + VecZnxBigNormalize<B>
 30        + VecZnxDftApply<B>
 31        + SvpApplyDftToDftInplace<B>
 32        + VecZnxIdftApplyConsume<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        + VecZnxIdftApplyTmpA<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 basek: usize = 12;
 69    let k: usize = 54;
 70    let digits: usize = k / basek;
 71    (1..3).for_each(|rank| {
 72        (1..digits + 1).for_each(|di| {
 73            let n: usize = module.n();
 74            let rows: usize = (k - di * basek) / (di * basek);
 75
 76            let mut ct: GGSWCiphertext<Vec<u8>> = GGSWCiphertext::alloc(n, basek, k, rows, di, rank);
 77
 78            let mut pt_scalar: ScalarZnx<Vec<u8>> = ScalarZnx::alloc(n, 1);
 79
 80            let mut source_xs: Source = Source::new([0u8; 32]);
 81            let mut source_xe: Source = Source::new([0u8; 32]);
 82            let mut source_xa: Source = Source::new([0u8; 32]);
 83
 84            pt_scalar.fill_ternary_hw(0, n, &mut source_xs);
 85
 86            let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GGSWCiphertext::encrypt_sk_scratch_space(
 87                module, basek, k, rank,
 88            ));
 89
 90            let mut sk: GLWESecret<Vec<u8>> = GLWESecret::alloc(n, rank);
 91            sk.fill_ternary_prob(0.5, &mut source_xs);
 92            let sk_prepared: GLWESecretPrepared<Vec<u8>, B> = sk.prepare_alloc(module, scratch.borrow());
 93
 94            ct.encrypt_sk(
 95                module,
 96                &pt_scalar,
 97                &sk_prepared,
 98                &mut source_xa,
 99                &mut source_xe,
100                scratch.borrow(),
101            );
102
103            let noise_f = |_col_i: usize| -(k as f64) + SIGMA.log2() + 0.5;
104
105            ct.assert_noise(module, &sk_prepared, &pt_scalar, noise_f);
106        });
107    });
108}
109
110pub fn test_ggsw_compressed_encrypt_sk<B>(module: &Module<B>)
111where
112    Module<B>: VecZnxDftAllocBytes
113        + VecZnxBigNormalize<B>
114        + VecZnxDftApply<B>
115        + SvpApplyDftToDftInplace<B>
116        + VecZnxIdftApplyConsume<B>
117        + VecZnxNormalizeTmpBytes
118        + VecZnxFillUniform
119        + VecZnxSubABInplace
120        + VecZnxAddInplace
121        + VecZnxNormalizeInplace<B>
122        + VecZnxAddNormal
123        + VecZnxNormalize<B>
124        + VecZnxSub
125        + SvpPrepare<B>
126        + SvpPPolAllocBytes
127        + SvpPPolAlloc<B>
128        + VecZnxBigAddSmallInplace<B>
129        + VecZnxAddScalarInplace
130        + VecZnxBigAllocBytes
131        + VecZnxBigAddInplace<B>
132        + VecZnxCopy
133        + VmpPMatAlloc<B>
134        + VmpPrepare<B>
135        + VecZnxBigAlloc<B>
136        + VecZnxDftAlloc<B>
137        + VecZnxBigNormalizeTmpBytes
138        + VecZnxIdftApplyTmpA<B>,
139    B: Backend
140        + TakeVecZnxDftImpl<B>
141        + TakeVecZnxBigImpl<B>
142        + ScratchOwnedAllocImpl<B>
143        + ScratchOwnedBorrowImpl<B>
144        + ScratchAvailableImpl<B>
145        + TakeScalarZnxImpl<B>
146        + TakeVecZnxImpl<B>
147        + VecZnxDftAllocBytesImpl<B>
148        + VecZnxBigAllocBytesImpl<B>
149        + TakeSvpPPolImpl<B>,
150{
151    let basek: usize = 12;
152    let k: usize = 54;
153    let digits: usize = k / basek;
154    (1..3).for_each(|rank| {
155        (1..digits + 1).for_each(|di| {
156            let n: usize = module.n();
157            let rows: usize = (k - di * basek) / (di * basek);
158
159            let mut ct_compressed: GGSWCiphertextCompressed<Vec<u8>> =
160                GGSWCiphertextCompressed::alloc(n, basek, k, rows, di, rank);
161
162            let mut pt_scalar: ScalarZnx<Vec<u8>> = ScalarZnx::alloc(n, 1);
163
164            let mut source_xs: Source = Source::new([0u8; 32]);
165            let mut source_xe: Source = Source::new([0u8; 32]);
166
167            pt_scalar.fill_ternary_hw(0, n, &mut source_xs);
168
169            let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GGSWCiphertextCompressed::encrypt_sk_scratch_space(
170                module, basek, k, rank,
171            ));
172
173            let mut sk: GLWESecret<Vec<u8>> = GLWESecret::alloc(n, rank);
174            sk.fill_ternary_prob(0.5, &mut source_xs);
175            let sk_prepared: GLWESecretPrepared<Vec<u8>, B> = sk.prepare_alloc(module, scratch.borrow());
176
177            let seed_xa: [u8; 32] = [1u8; 32];
178
179            ct_compressed.encrypt_sk(
180                module,
181                &pt_scalar,
182                &sk_prepared,
183                seed_xa,
184                &mut source_xe,
185                scratch.borrow(),
186            );
187
188            let noise_f = |_col_i: usize| -(k as f64) + SIGMA.log2() + 0.5;
189
190            let mut ct: GGSWCiphertext<Vec<u8>> = GGSWCiphertext::alloc(n, basek, k, rows, di, rank);
191            ct.decompress(module, &ct_compressed);
192
193            ct.assert_noise(module, &sk_prepared, &pt_scalar, noise_f);
194        });
195    });
196}