arnaucube
arnaucube/phantom-zonePublic Self-hosted repository
phantom-zone/examples/interactive_fheuint8.rs
examples/interactive_fheuint8.rsRaw
 1use bin_rs::*;
 2use itertools::Itertools;
 3use rand::{thread_rng, RngCore};
 4
 5fn plain_circuit(a: u8, b: u8, c: u8) -> u8 {
 6    (a + b) * c
 7}
 8
 9fn fhe_circuit(fhe_a: &FheUint8, fhe_b: &FheUint8, fhe_c: &FheUint8) -> FheUint8 {
10    &(fhe_a + fhe_b) * fhe_c
11}
12
13fn main() {
14    set_parameter_set(ParameterSelector::InteractiveLTE2Party);
15    let no_of_parties = 2;
16    let client_keys = (0..no_of_parties)
17        .into_iter()
18        .map(|_| gen_client_key())
19        .collect_vec();
20
21    // set Multi-Party seed
22    let mut seed = [0u8; 32];
23    thread_rng().fill_bytes(&mut seed);
24    set_mp_seed(seed);
25
26    // multi-party key gen round 1
27    let pk_shares = client_keys
28        .iter()
29        .map(|k| gen_mp_keys_phase1(k))
30        .collect_vec();
31
32    // create public key
33    let public_key = aggregate_public_key_shares(&pk_shares);
34
35    // multi-party key gen round 2
36    let server_key_shares = client_keys
37        .iter()
38        .map(|k| gen_mp_keys_phase2(k, &public_key))
39        .collect_vec();
40
41    // server aggregates server key shares and sets it
42    let server_key = aggregate_server_key_shares(&server_key_shares);
43    server_key.set_server_key();
44
45    // private inputs
46    let a = 4u8;
47    let b = 6u8;
48    let c = 128u8;
49    let fhe_a = public_key.encrypt(&a);
50    let fhe_b = public_key.encrypt(&b);
51    let fhe_c = public_key.encrypt(&c);
52
53    // fhe evaluation
54    let now = std::time::Instant::now();
55    let fhe_out = fhe_circuit(&fhe_a, &fhe_b, &fhe_c);
56    println!("Circuit time: {:?}", now.elapsed());
57
58    // plain evaluation
59    let out = plain_circuit(a, b, c);
60
61    // generate decryption shares to decrypt ciphertext fhe_out
62    let decryption_shares = client_keys
63        .iter()
64        .map(|k| k.gen_decryption_share(&fhe_out))
65        .collect_vec();
66
67    // decrypt fhe_out using decryption shares
68    let got_out = client_keys[0].aggregate_decryption_shares(&fhe_out, &decryption_shares);
69
70    assert_eq!(got_out, out);
71}