arnaucube
arnaucube/phantom-zonePublic Self-hosted repository
phantom-zone/examples/non_interactive_fhebool.rs
examples/non_interactive_fhebool.rsRaw
 1use itertools::Itertools;
 2use rand::{thread_rng, RngCore};
 3
 4use phantom_zone::*;
 5
 6fn main() {
 7    set_parameter_set(ParameterSelector::NonInteractiveLTE2Party);
 8
 9    let mut seed = [0u8; 32];
10    thread_rng().fill_bytes(&mut seed);
11    set_common_reference_seed(seed);
12
13    let parties = 2;
14
15    let cks = (0..parties).map(|_| gen_client_key()).collect_vec();
16
17    let s_key_shares = cks
18        .iter()
19        .enumerate()
20        .map(|(user_id, k)| gen_server_key_share(user_id, parties, k))
21        .collect_vec();
22
23    let server_key = aggregate_server_key_shares(&s_key_shares);
24    server_key.set_server_key();
25
26    let m00 = true;
27    let m01 = false;
28    let m10 = true;
29    let m11 = false;
30
31    let c0 = cks[0].encrypt(vec![m00, m01].as_slice());
32    let c1 = cks[1].encrypt(vec![m10, m11].as_slice());
33
34    let (enc_m00, enc_m01) = {
35        let mut tmp = c0.unseed::<Vec<Vec<u64>>>().key_switch(0).extract_all();
36        (tmp.swap_remove(0), tmp.swap_remove(0))
37    };
38
39    let (enc_m10, enc_m11) = {
40        let mut tmp = c1.unseed::<Vec<Vec<u64>>>().key_switch(1).extract_all();
41        (tmp.swap_remove(0), tmp.swap_remove(0))
42    };
43
44    let enc_out = &(&enc_m00 & &enc_m10) | &(&enc_m01 ^ &enc_m11);
45    let out = (m00 & m10) | (m10 ^ m11);
46
47    let dec_shares = cks
48        .iter()
49        .map(|k| k.gen_decryption_share(&enc_out))
50        .collect_vec();
51    let out_back = cks[0].aggregate_decryption_shares(&enc_out, &dec_shares);
52
53    assert!(out == out_back);
54}