phantom-zone/examples/fheuint8.rs
examples/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::MultiPartyLessThanOrEqualTo16);
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}