arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-schemes/src/tfhe/bdd_arithmetic/tests/test_suite/fheuint.rs
poulpy-schemes/src/tfhe/bdd_arithmetic/tests/test_suite/fheuint.rsRaw
  1use poulpy_core::{
  2    GLWEAdd, GLWEDecrypt, GLWEEncryptSk, GLWERotate, GLWESub, GLWETrace,
  3    layouts::{GLWELayout, GLWESecretPrepared},
  4};
  5use poulpy_hal::{
  6    api::{ScratchOwnedAlloc, ScratchOwnedBorrow},
  7    layouts::{Backend, Module, Scratch, ScratchOwned},
  8    source::Source,
  9};
 10
 11use crate::tfhe::{
 12    bdd_arithmetic::{
 13        BDDKeyPrepared, FheUint, ScratchTakeBDD,
 14        tests::test_suite::{TEST_GLWE_INFOS, TestContext},
 15    },
 16    blind_rotation::BlindRotationAlgo,
 17};
 18
 19pub fn test_fhe_uint_sext<BRA: BlindRotationAlgo, BE: Backend>(test_context: &TestContext<BRA, BE>)
 20where
 21    Module<BE>: GLWEEncryptSk<BE> + GLWERotate<BE> + GLWETrace<BE> + GLWESub + GLWEAdd + GLWEDecrypt<BE>,
 22    ScratchOwned<BE>: ScratchOwnedAlloc<BE> + ScratchOwnedBorrow<BE>,
 23    Scratch<BE>: ScratchTakeBDD<u32, BE>,
 24{
 25    let glwe_infos: GLWELayout = TEST_GLWE_INFOS;
 26
 27    let module: &Module<BE> = &test_context.module;
 28    let sk: &GLWESecretPrepared<Vec<u8>, BE> = &test_context.sk_glwe;
 29    let keys: &BDDKeyPrepared<Vec<u8>, BRA, BE> = &test_context.bdd_key;
 30
 31    let mut source_xa: Source = Source::new([2u8; 32]);
 32    let mut source_xe: Source = Source::new([3u8; 32]);
 33
 34    let mut scratch: ScratchOwned<BE> = ScratchOwned::alloc(1 << 22);
 35
 36    let mut a_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 37
 38    for j in 0..3 {
 39        for i in 0..32 {
 40            let a: u32 = 0xFFFFFFFF >> i;
 41
 42            a_enc.encrypt_sk(
 43                module,
 44                a,
 45                sk,
 46                &mut source_xa,
 47                &mut source_xe,
 48                scratch.borrow(),
 49            );
 50
 51            a_enc.sext(module, j, keys, scratch.borrow());
 52
 53            // println!("{:08x} -> {:08x} {:08x}", a, sext(a, j), a_enc.decrypt(module, sk, scratch.borrow()));
 54
 55            assert_eq!(sext(a, j), a_enc.decrypt(module, sk, scratch.borrow()));
 56        }
 57    }
 58}
 59
 60pub fn sext(x: u32, byte: usize) -> u32 {
 61    x | (((x >> (byte << 3)) & 1) * (0xFFFF_FFFF << (byte << 3)))
 62}
 63
 64pub fn test_fhe_uint_splice_u8<BRA: BlindRotationAlgo, BE: Backend>(test_context: &TestContext<BRA, BE>)
 65where
 66    Module<BE>: GLWEEncryptSk<BE> + GLWERotate<BE> + GLWETrace<BE> + GLWESub + GLWEAdd + GLWEDecrypt<BE>,
 67    ScratchOwned<BE>: ScratchOwnedAlloc<BE> + ScratchOwnedBorrow<BE>,
 68    Scratch<BE>: ScratchTakeBDD<u32, BE>,
 69{
 70    let glwe_infos: GLWELayout = TEST_GLWE_INFOS;
 71
 72    let module: &Module<BE> = &test_context.module;
 73    let sk: &GLWESecretPrepared<Vec<u8>, BE> = &test_context.sk_glwe;
 74    let keys: &BDDKeyPrepared<Vec<u8>, BRA, BE> = &test_context.bdd_key;
 75
 76    let mut source_xa: Source = Source::new([2u8; 32]);
 77    let mut source_xe: Source = Source::new([3u8; 32]);
 78
 79    let mut scratch: ScratchOwned<BE> = ScratchOwned::alloc(1 << 22);
 80
 81    let mut a_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 82    let mut b_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 83    let mut c_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 84
 85    let a: u32 = 0xFFFFFFFF;
 86    let b: u32 = 0xAABBCCDD;
 87
 88    b_enc.encrypt_sk(
 89        module,
 90        b,
 91        sk,
 92        &mut source_xa,
 93        &mut source_xe,
 94        scratch.borrow(),
 95    );
 96    a_enc.encrypt_sk(
 97        module,
 98        a,
 99        sk,
100        &mut source_xa,
101        &mut source_xe,
102        scratch.borrow(),
103    );
104
105    for dst in 0..4 {
106        for src in 0..4 {
107            c_enc.splice_u8(module, dst, src, &a_enc, &b_enc, keys, scratch.borrow());
108
109            let rj: u32 = (dst << 3) as u32;
110            let ri: u32 = (src << 3) as u32;
111            let a_r: u32 = a.rotate_right(rj);
112            let b_r: u32 = b.rotate_right(ri);
113
114            let c_want: u32 = ((a_r & 0xFFFF_FF00) | (b_r & 0x0000_00FF)).rotate_left(rj);
115
116            assert_eq!(c_want, c_enc.decrypt(module, sk, scratch.borrow()));
117        }
118    }
119}
120
121pub fn test_fhe_uint_splice_u16<BRA: BlindRotationAlgo, BE: Backend>(test_context: &TestContext<BRA, BE>)
122where
123    Module<BE>: GLWEEncryptSk<BE> + GLWERotate<BE> + GLWETrace<BE> + GLWESub + GLWEAdd + GLWEDecrypt<BE>,
124    ScratchOwned<BE>: ScratchOwnedAlloc<BE> + ScratchOwnedBorrow<BE>,
125    Scratch<BE>: ScratchTakeBDD<u32, BE>,
126{
127    let glwe_infos: GLWELayout = TEST_GLWE_INFOS;
128
129    let module: &Module<BE> = &test_context.module;
130    let sk: &GLWESecretPrepared<Vec<u8>, BE> = &test_context.sk_glwe;
131    let keys: &BDDKeyPrepared<Vec<u8>, BRA, BE> = &test_context.bdd_key;
132
133    let mut source_xa: Source = Source::new([2u8; 32]);
134    let mut source_xe: Source = Source::new([3u8; 32]);
135
136    let mut scratch: ScratchOwned<BE> = ScratchOwned::alloc(1 << 22);
137
138    let mut a_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
139    let mut b_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
140    let mut c_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
141
142    let a: u32 = 0xFFFFFFFF;
143    let b: u32 = 0xAABBCCDD;
144
145    b_enc.encrypt_sk(
146        module,
147        b,
148        sk,
149        &mut source_xa,
150        &mut source_xe,
151        scratch.borrow(),
152    );
153    a_enc.encrypt_sk(
154        module,
155        a,
156        sk,
157        &mut source_xa,
158        &mut source_xe,
159        scratch.borrow(),
160    );
161
162    for dst in 0..2 {
163        for src in 0..2 {
164            c_enc.splice_u16(module, dst, src, &a_enc, &b_enc, keys, scratch.borrow());
165            let rj: u32 = (dst << 4) as u32;
166            let ri: u32 = (src << 4) as u32;
167            let a_r: u32 = a.rotate_right(rj);
168            let b_r: u32 = b.rotate_right(ri);
169            let c_want: u32 = ((a_r & 0xFFFF_0000) | (b_r & 0x0000_FFFF)).rotate_left(rj);
170            assert_eq!(c_want, c_enc.decrypt(module, sk, scratch.borrow()));
171        }
172    }
173}