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_splice_u8<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    let mut b_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 38    let mut c_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 39
 40    let a: u32 = 0xFFFFFFFF;
 41    let b: u32 = 0xAABBCCDD;
 42
 43    b_enc.encrypt_sk(
 44        module,
 45        b,
 46        sk,
 47        &mut source_xa,
 48        &mut source_xe,
 49        scratch.borrow(),
 50    );
 51    a_enc.encrypt_sk(
 52        module,
 53        a,
 54        sk,
 55        &mut source_xa,
 56        &mut source_xe,
 57        scratch.borrow(),
 58    );
 59
 60    for dst in 0..4 {
 61        for src in 0..4 {
 62            c_enc.splice_u8(module, dst, src, &a_enc, &b_enc, keys, scratch.borrow());
 63
 64            let rj: u32 = (dst << 3) as u32;
 65            let ri: u32 = (src << 3) as u32;
 66            let a_r: u32 = a.rotate_right(rj);
 67            let b_r: u32 = b.rotate_right(ri);
 68
 69            let c_want: u32 = ((a_r & 0xFFFF_FF00) | (b_r & 0x0000_00FF)).rotate_left(rj);
 70
 71            assert_eq!(c_want, c_enc.decrypt(module, sk, scratch.borrow()));
 72        }
 73    }
 74}
 75
 76pub fn test_fhe_uint_splice_u16<BRA: BlindRotationAlgo, BE: Backend>(test_context: &TestContext<BRA, BE>)
 77where
 78    Module<BE>: GLWEEncryptSk<BE> + GLWERotate<BE> + GLWETrace<BE> + GLWESub + GLWEAdd + GLWEDecrypt<BE>,
 79    ScratchOwned<BE>: ScratchOwnedAlloc<BE> + ScratchOwnedBorrow<BE>,
 80    Scratch<BE>: ScratchTakeBDD<u32, BE>,
 81{
 82    let glwe_infos: GLWELayout = TEST_GLWE_INFOS;
 83
 84    let module: &Module<BE> = &test_context.module;
 85    let sk: &GLWESecretPrepared<Vec<u8>, BE> = &test_context.sk_glwe;
 86    let keys: &BDDKeyPrepared<Vec<u8>, BRA, BE> = &test_context.bdd_key;
 87
 88    let mut source_xa: Source = Source::new([2u8; 32]);
 89    let mut source_xe: Source = Source::new([3u8; 32]);
 90
 91    let mut scratch: ScratchOwned<BE> = ScratchOwned::alloc(1 << 22);
 92
 93    let mut a_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 94    let mut b_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 95    let mut c_enc: FheUint<Vec<u8>, u32> = FheUint::<Vec<u8>, u32>::alloc_from_infos(&glwe_infos);
 96
 97    let a: u32 = 0xFFFFFFFF;
 98    let b: u32 = 0xAABBCCDD;
 99
100    b_enc.encrypt_sk(
101        module,
102        b,
103        sk,
104        &mut source_xa,
105        &mut source_xe,
106        scratch.borrow(),
107    );
108    a_enc.encrypt_sk(
109        module,
110        a,
111        sk,
112        &mut source_xa,
113        &mut source_xe,
114        scratch.borrow(),
115    );
116
117    for dst in 0..2 {
118        for src in 0..2 {
119            c_enc.splice_u16(module, dst, src, &a_enc, &b_enc, keys, scratch.borrow());
120            let rj: u32 = (dst << 4) as u32;
121            let ri: u32 = (src << 4) as u32;
122            let a_r: u32 = a.rotate_right(rj);
123            let b_r: u32 = b.rotate_right(ri);
124            let c_want: u32 = ((a_r & 0xFFFF_0000) | (b_r & 0x0000_FFFF)).rotate_left(rj);
125            assert_eq!(c_want, c_enc.decrypt(module, sk, scratch.borrow()));
126        }
127    }
128}