poulpy/poulpy-core/src/tests/test_suite/conversion.rs
poulpy-core/src/tests/test_suite/conversion.rsRaw
1use poulpy_hal::{
2 api::{ScratchAvailable, ScratchOwnedAlloc, ScratchOwnedBorrow},
3 layouts::{Backend, Module, Scratch, ScratchOwned, ZnxView},
4 source::Source,
5};
6
7use crate::{
8 GLWEDecrypt, GLWEEncryptSk, GLWEFromLWE, GLWEToLWESwitchingKeyEncryptSk, LWEDecrypt, LWEEncryptSk,
9 LWEToGLWESwitchingKeyEncryptSk, ScratchTakeCore,
10 layouts::{
11 Base2K, Degree, Dnum, GLWE, GLWELayout, GLWEPlaintext, GLWESecret, GLWESecretPreparedFactory, GLWEToLWEKeyLayout,
12 GLWEToLWESwitchingKey, GLWEToLWESwitchingKeyPreparedFactory, LWE, LWELayout, LWEPlaintext, LWESecret,
13 LWEToGLWESwitchingKey, LWEToGLWESwitchingKeyLayout, LWEToGLWESwitchingKeyPreparedFactory, Rank, TorusPrecision,
14 prepared::{GLWESecretPrepared, GLWEToLWESwitchingKeyPrepared, LWEToGLWESwitchingKeyPrepared},
15 },
16};
17
18pub fn test_lwe_to_glwe<BE: Backend>(module: &Module<BE>)
19where
20 Module<BE>: GLWEFromLWE<BE>
21 + LWEToGLWESwitchingKeyEncryptSk<BE>
22 + GLWEDecrypt<BE>
23 + GLWESecretPreparedFactory<BE>
24 + LWEEncryptSk<BE>
25 + LWEToGLWESwitchingKeyPreparedFactory<BE>,
26 ScratchOwned<BE>: ScratchOwnedAlloc<BE> + ScratchOwnedBorrow<BE>,
27 Scratch<BE>: ScratchAvailable + ScratchTakeCore<BE>,
28{
29 let n_glwe: Degree = Degree(module.n() as u32);
30 let n_lwe: Degree = Degree(22);
31
32 let rank: Rank = Rank(2);
33 let k_lwe_pt: TorusPrecision = TorusPrecision(8);
34
35 let mut source_xs: Source = Source::new([0u8; 32]);
36 let mut source_xa: Source = Source::new([0u8; 32]);
37 let mut source_xe: Source = Source::new([0u8; 32]);
38
39 let lwe_to_glwe_infos: LWEToGLWESwitchingKeyLayout = LWEToGLWESwitchingKeyLayout {
40 n: n_glwe,
41 base2k: Base2K(17),
42 k: TorusPrecision(51),
43 dnum: Dnum(2),
44 rank_out: rank,
45 };
46
47 let glwe_infos: GLWELayout = GLWELayout {
48 n: n_glwe,
49 base2k: Base2K(17),
50 k: TorusPrecision(34),
51 rank,
52 };
53
54 let lwe_infos: LWELayout = LWELayout {
55 n: n_lwe,
56 base2k: Base2K(17),
57 k: TorusPrecision(34),
58 };
59
60 let mut scratch: ScratchOwned<BE> = ScratchOwned::alloc(
61 LWEToGLWESwitchingKey::encrypt_sk_tmp_bytes(module, &lwe_to_glwe_infos)
62 | GLWE::from_lwe_tmp_bytes(module, &glwe_infos, &lwe_infos, &lwe_to_glwe_infos)
63 | GLWE::decrypt_tmp_bytes(module, &glwe_infos),
64 );
65
66 let mut sk_glwe: GLWESecret<Vec<u8>> = GLWESecret::alloc_from_infos(&glwe_infos);
67 sk_glwe.fill_ternary_prob(0.5, &mut source_xs);
68
69 let mut sk_glwe_prepared: GLWESecretPrepared<Vec<u8>, BE> = GLWESecretPrepared::alloc_from_infos(module, &sk_glwe);
70 sk_glwe_prepared.prepare(module, &sk_glwe);
71
72 let mut sk_lwe: LWESecret<Vec<u8>> = LWESecret::alloc(n_lwe);
73 sk_lwe.fill_ternary_prob(0.5, &mut source_xs);
74
75 let data: i64 = 17;
76
77 let mut lwe_pt: LWEPlaintext<Vec<u8>> = LWEPlaintext::alloc_from_infos(&lwe_infos);
78 lwe_pt.encode_i64(data, k_lwe_pt);
79
80 let mut lwe_ct: LWE<Vec<u8>> = LWE::alloc_from_infos(&lwe_infos);
81 lwe_ct.encrypt_sk(module, &lwe_pt, &sk_lwe, &mut source_xa, &mut source_xe);
82
83 let mut ksk: LWEToGLWESwitchingKey<Vec<u8>> = LWEToGLWESwitchingKey::alloc_from_infos(&lwe_to_glwe_infos);
84
85 ksk.encrypt_sk(
86 module,
87 &sk_lwe,
88 &sk_glwe_prepared,
89 &mut source_xa,
90 &mut source_xe,
91 scratch.borrow(),
92 );
93
94 let mut glwe_ct: GLWE<Vec<u8>> = GLWE::alloc_from_infos(&glwe_infos);
95
96 let mut ksk_prepared: LWEToGLWESwitchingKeyPrepared<Vec<u8>, BE> =
97 LWEToGLWESwitchingKeyPrepared::alloc_from_infos(module, &ksk);
98 ksk_prepared.prepare(module, &ksk, scratch.borrow());
99
100 glwe_ct.from_lwe(module, &lwe_ct, &ksk_prepared, scratch.borrow());
101
102 let mut glwe_pt: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc_from_infos(&glwe_infos);
103 glwe_ct.decrypt(module, &mut glwe_pt, &sk_glwe_prepared, scratch.borrow());
104
105 assert_eq!(glwe_pt.data.at(0, 0)[0], lwe_pt.data.at(0, 0)[0]);
106}
107
108pub fn test_glwe_to_lwe<BE: Backend>(module: &Module<BE>)
109where
110 Module<BE>: GLWEFromLWE<BE>
111 + GLWEToLWESwitchingKeyEncryptSk<BE>
112 + GLWEEncryptSk<BE>
113 + LWEDecrypt<BE>
114 + GLWEDecrypt<BE>
115 + GLWESecretPreparedFactory<BE>
116 + GLWEToLWESwitchingKeyEncryptSk<BE>
117 + GLWEToLWESwitchingKeyPreparedFactory<BE>,
118 ScratchOwned<BE>: ScratchOwnedAlloc<BE> + ScratchOwnedBorrow<BE>,
119 Scratch<BE>: ScratchAvailable + ScratchTakeCore<BE>,
120{
121 let n_glwe: Degree = Degree(module.n() as u32);
122 let n_lwe: Degree = Degree(22);
123
124 let rank: Rank = Rank(2);
125 let k_lwe_pt: TorusPrecision = TorusPrecision(8);
126
127 let glwe_to_lwe_infos: GLWEToLWEKeyLayout = GLWEToLWEKeyLayout {
128 n: n_glwe,
129 base2k: Base2K(17),
130 k: TorusPrecision(51),
131 dnum: Dnum(2),
132 rank_in: rank,
133 };
134
135 let glwe_infos: GLWELayout = GLWELayout {
136 n: n_glwe,
137 base2k: Base2K(17),
138 k: TorusPrecision(34),
139 rank,
140 };
141
142 let lwe_infos: LWELayout = LWELayout {
143 n: n_lwe,
144 base2k: Base2K(17),
145 k: TorusPrecision(34),
146 };
147
148 let mut source_xs: Source = Source::new([0u8; 32]);
149 let mut source_xa: Source = Source::new([0u8; 32]);
150 let mut source_xe: Source = Source::new([0u8; 32]);
151
152 let mut scratch: ScratchOwned<BE> = ScratchOwned::alloc(
153 GLWEToLWESwitchingKey::encrypt_sk_tmp_bytes(module, &glwe_to_lwe_infos)
154 | LWE::from_glwe_tmp_bytes(module, &lwe_infos, &glwe_infos, &glwe_to_lwe_infos)
155 | GLWE::decrypt_tmp_bytes(module, &glwe_infos),
156 );
157
158 let mut sk_glwe: GLWESecret<Vec<u8>> = GLWESecret::alloc_from_infos(&glwe_infos);
159 sk_glwe.fill_ternary_prob(0.5, &mut source_xs);
160
161 let mut sk_glwe_prepared: GLWESecretPrepared<Vec<u8>, BE> = GLWESecretPrepared::alloc_from_infos(module, &sk_glwe);
162 sk_glwe_prepared.prepare(module, &sk_glwe);
163
164 let mut sk_lwe: LWESecret<Vec<u8>> = LWESecret::alloc(n_lwe);
165 sk_lwe.fill_ternary_prob(0.5, &mut source_xs);
166
167 let data: i64 = 17;
168 let mut glwe_pt: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc_from_infos(&glwe_infos);
169 glwe_pt.encode_coeff_i64(data, k_lwe_pt, 0);
170
171 let mut glwe_ct: GLWE<Vec<u8>> = GLWE::alloc_from_infos(&glwe_infos);
172 glwe_ct.encrypt_sk(
173 module,
174 &glwe_pt,
175 &sk_glwe_prepared,
176 &mut source_xa,
177 &mut source_xe,
178 scratch.borrow(),
179 );
180
181 let mut ksk: GLWEToLWESwitchingKey<Vec<u8>> = GLWEToLWESwitchingKey::alloc_from_infos(&glwe_to_lwe_infos);
182
183 ksk.encrypt_sk(
184 module,
185 &sk_lwe,
186 &sk_glwe,
187 &mut source_xa,
188 &mut source_xe,
189 scratch.borrow(),
190 );
191
192 let mut lwe_ct: LWE<Vec<u8>> = LWE::alloc_from_infos(&lwe_infos);
193
194 let mut ksk_prepared: GLWEToLWESwitchingKeyPrepared<Vec<u8>, BE> =
195 GLWEToLWESwitchingKeyPrepared::alloc_from_infos(module, &ksk);
196 ksk_prepared.prepare(module, &ksk, scratch.borrow());
197
198 lwe_ct.from_glwe(module, &glwe_ct, &ksk_prepared, scratch.borrow());
199
200 let mut lwe_pt: LWEPlaintext<Vec<u8>> = LWEPlaintext::alloc_from_infos(&lwe_infos);
201 lwe_ct.decrypt(module, &mut lwe_pt, &sk_lwe);
202
203 assert_eq!(glwe_pt.data.at(0, 0)[0], lwe_pt.data.at(0, 0)[0]);
204}