/* This file is part of DarkFi (https://dark.fi) * * Copyright (C) 2020-2023 Dyne.org foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ use tfhe::shortint::{gen_keys, Parameters}; fn main() { // Generate a set of client/server keys, using the default parameters. // The client generates both keys. The server key is meant to be published // so that homomorphic circuits can be computed. let (client_key, server_key) = gen_keys(Parameters::default()); let msg1 = 3; let msg2 = 2; // Encrypt two messages using the (private) client key: let ct_1 = client_key.encrypt(msg1); let ct_2 = client_key.encrypt(msg2); // Homomorphically compute an addition let ct_add = server_key.unchecked_add(&ct_1, &ct_2); // Define the Hamming weight function // f: x -> sum of the bits of x let f = |x: u64| x.count_ones() as u64; // Generate the accumulator for the function let acc = server_key.generate_accumulator(f); // Compute the function over the ciphertext using the PBS let ct_res = server_key.keyswitch_programmable_bootstrap(&ct_add, &acc); // Decrypt the ciphertext using the (private) client key let output = client_key.decrypt(&ct_res); assert_eq!(output, f(msg1 + msg2)); println!("{:#b}", msg1 + msg2); }